﻿// Copyright (c) Drew Noakes and contributors. All Rights Reserved. Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.

namespace MetadataExtractor.Formats.GeoTiff
{
    public sealed class GeoTiffDescriptor(GeoTiffDirectory directory)
        : TagDescriptor<GeoTiffDirectory>(directory)
    {
        public override string? GetDescription(int tagType)
        {
#pragma warning disable format

            return tagType switch
            {
                GeoTiffDirectory.TagModelType                    => GetModelTypeDescription(),
                GeoTiffDirectory.TagRasterType                   => GetRasterTypeDescription(),
                GeoTiffDirectory.TagGeographicType               => GetGeographicTypeDescription(),
                GeoTiffDirectory.TagGeodeticDatum                => GetGeodeticDatumDescription(),
                GeoTiffDirectory.TagGeographicPrimeMeridian      => GetPrimeMeridianDescription(),
                GeoTiffDirectory.TagGeographicLinearUnits        => GetGeoTiffUnitsDescription(GeoTiffDirectory.TagGeographicLinearUnits),
                GeoTiffDirectory.TagGeographicAngularUnits       => GetGeoTiffUnitsDescription(GeoTiffDirectory.TagGeographicAngularUnits),
                GeoTiffDirectory.TagGeographicEllipsoid          => GetGeographicEllipsoidDescription(),
                GeoTiffDirectory.TagProjectedCSType              => GetProjectedCoordinateSystemDescription(),
                GeoTiffDirectory.TagProjection                   => GetProjectionDescription(),
                GeoTiffDirectory.TagProjectedCoordinateTransform => GetProjectedCoordinateTransformDescription(),
                GeoTiffDirectory.TagProjLinearUnits              => GetGeoTiffUnitsDescription(GeoTiffDirectory.TagProjLinearUnits),
                GeoTiffDirectory.TagVerticalCSType               => GetGeoTiffVerticalCSDescription(GeoTiffDirectory.TagVerticalCSType),
                GeoTiffDirectory.TagVerticalDatum                => GetGeoTiffVerticalCSDescription(GeoTiffDirectory.TagVerticalDatum),
                GeoTiffDirectory.TagVerticalUnits                => GetGeoTiffUnitsDescription(GeoTiffDirectory.TagVerticalUnits),
                GeoTiffDirectory.TagChartFormat                  => GetChartFormatDescription(),
                GeoTiffDirectory.TagChartSoundingDatum           => GetChartSoundingDatumDescription(),
                GeoTiffDirectory.TagChartDepthUnits              => GetGeoTiffUnitsDescription(GeoTiffDirectory.TagChartDepthUnits),

                _ => base.GetDescription(tagType)
            };

#pragma warning restore format
        }

        private string? GetGeoTiffUnitsDescription(int tagType)
        {
            if (!Directory.TryGetUInt16(tagType, out ushort value))
                return null;

            // Requirement 16.4
            // GeogAngularUnitsGeoKey and GeogAzimuthUnitsGeoKey values in the range 1024-32766 SHALL be EPSG Unit Of Measure (UOM) codes with type = angle.
            // NOTE: In GeoTIFF v1.0 the range was 9100-9199

            // Requirement 16.5
            // GeogLinearUnitsGeoKey, ProjLinearUnitsGeoKey and VerticalUnitsGeoKey values in the range 1024-32766 SHALL be EPSG Unit Of Measure (UOM) codes with type = length.
            // NOTE: In GeoTIFF v1.0 the range was 9000-9099. Several values in this range have been deprecated or deleted from the EPSG Dataset and should no longer be used.

            return value switch
            {
                9001 => "Linear Meter",
                9002 => "Linear Foot",
                9003 => "Linear Foot US Survey",
                9004 => "Linear Foot Modified American",
                9005 => "Linear Foot Clarke",
                9006 => "Linear Foot Indian",
                9007 => "Linear Link",
                9008 => "Linear Link Benoit",
                9009 => "Linear Link Sears",
                9010 => "Linear Chain Benoit",
                9011 => "Linear Chain Sears",
                9012 => "Linear Yard Sears",
                9013 => "Linear Yard Indian",
                9014 => "Linear Fathom",
                9015 => "Linear Mile International Nautical",
                9030 => "Linear Mile Nautical",
                9031 => "Linear Meter German Legal",
                9033 => "Linear Chain US Survey",
                9034 => "Linear Link US Survey",
                9035 => "Linear Mile US Survey",
                9036 => "Linear Kilometer",
                9037 => "Linear Yard Clarke",
                9038 => "Linear Chain Clarke",
                9039 => "Linear Link Clarke",
                9040 => "Linear Yard British Sears 1922",
                9041 => "Linear Foot British Sears 1922",
                9042 => "Linear Chain British Sears 1922",
                9043 => "Linear Link British Sears 1922",
                9050 => "Linear Yard British Benoit 1895 A",
                9051 => "Linear Foot British Benoit 1895 A",
                9052 => "Linear Chain British Benoit 1895 A",
                9053 => "Linear Link British Benoit 1895 A",
                9060 => "Linear Yard British Benoit 1895 B",
                9061 => "Linear Foot British Benoit 1895 B",
                9062 => "Linear Chain British Benoit 1895 B",
                9063 => "Linear Link British Benoit 1895 B",
                9070 => "Linear Foot British 1865",
                9080 => "Linear Foot Indian",
                9081 => "Linear Foot Indian 1937",
                9082 => "Linear Foot Indian 1962",
                9083 => "Linear Foot Indian 1975",
                9084 => "Linear Yard Indian",
                9085 => "Linear Yard Indian 1937",
                9086 => "Linear Yard Indian 1962",
                9087 => "Linear Yard Indian 1975",
                9093 => "Linear Mile Statute",
                9094 => "Linear Foot Gold Coast",
                9095 => "Linear Foot British 1936",
                9096 => "Linear Yard",
                9097 => "Linear Chain",
                9098 => "Linear Link",
                // Angular
                9101 => "Angular Radian",
                9102 => "Angular Degree",
                9103 => "Angular Arc Minute",
                9104 => "Angular Arc Second",
                9105 => "Angular Grad",
                9106 => "Angular Gon",
                9107 => "Angular DMS",
                9108 => "Angular DMS Hemisphere",
                9109 => "Angular Microradian",
                9110 => "Angular Sexagesimal DMS",
                9111 => "Angular Sexagesimal DM",
                9112 => "Angular Centesimal Minute",
                9113 => "Angular Centesimal Second",
                9114 => "Angular 6400 mil",
                9115 => "Angular DM",
                9116 => "Angular Degree Hemisphere",
                9117 => "Angular Hemisphere Degree",
                9118 => "Angular DM Hemisphere",
                9119 => "Angular Hemisphere DM",
                9120 => "Angular Hemisphere DMS",
                9121 => "Angular Sexagesimal DMS.s",
                9122 => "Angular Degree (supplier to define representation)",
                // Other
                32767 => "User Defined",
                _ => "Unknown (" + value + ")"
            };
        }

        private string? GetGeoTiffVerticalCSDescription(int tagType)
        {
            if (!Directory.TryGetUInt16(tagType, out ushort value))
                return null;

            // Requirement 14.4
            // VerticalGeoKey values in the range 1024-32766 SHALL be either EPSG Vertical CRS Codes or EPSG geographic 3D CRS codes
            // NOTE: In GeoTIFF v1.0 the ranges were 5000-5099 and 5200-5999. As at 2018-05-29 no EPSG vertical CRSs have been or are in this range.
            // Values in this range have been and are used as EPSG vertical datum codes; in this document their use as codes for vertical CRSs is deprecated.

            // Requirement 25.4
            // VerticalDatumGeoKey values in the range 1024-32766 SHALL be EPSG vertical datum codes
            // NOTE: In GeoTIFF v1.0 the range was given as 1-16383 but without reference to EPSG.

            return value switch
            {
                0 => "Undefined",
                5001 => "Airy 1830 ellipsoid",
                5002 => "Airy Modified 1849 ellipsoid",
                5003 => "ANS ellipsoid",
                5004 => "Bessel 1841 ellipsoid",
                5005 => "Bessel Modified ellipsoid",
                5006 => "Bessel Namibia ellipsoid",
                5007 => "Clarke 1858 ellipsoid",
                5008 => "Clarke 1866 ellipsoid",
                5010 => "Clarke 1880 Benoit ellipsoid",
                5011 => "Clarke 1880 IGN ellipsoid",
                5012 => "Clarke 1880 RGS ellipsoid",
                5013 => "Clarke 1880 Arc ellipsoid",
                5014 => "Clarke 1880 SGA 1922 ellipsoid",
                5015 => "Everest 1830 1937 Adjustment ellipsoid",
                5016 => "Everest 1830 1967 Definition ellipsoid",
                5017 => "Everest 1830 1975 Definition ellipsoid",
                5018 => "Everest 1830 Modified ellipsoid",
                5019 => "GRS 1980 ellipsoid",
                5020 => "Helmert 1906 ellipsoid",
                5021 => "INS ellipsoid",
                5022 => "International 1924 ellipsoid",
                5023 => "International 1967 ellipsoid",
                5024 => "Krassowsky 1940 ellipsoid",
                5025 => "NWL 9D ellipsoid",
                5026 => "NWL 10D ellipsoid",
                5027 => "Plessis 1817 ellipsoid",
                5028 => "Struve 1860 ellipsoid",
                5029 => "War Office ellipsoid",
                5030 => "WGS 84 ellipsoid",
                5031 => "GEM 10C ellipsoid",
                5032 => "OSU86F ellipsoid",
                5033 => "OSU91A ellipsoid",
                5101 => "Newlyn",
                5102 => "North American Vertical Datum 1929",
                5103 => "North American Vertical Datum 1988",
                5104 => "Yellow Sea 1956",
                5105 => "Baltic Sea",
                5106 => "Caspian Sea",
                32767 => "User Defined",
                _ => "Unknown (" + value + ")"
            };
        }

        public string? GetModelTypeDescription()
        {
            if (!Directory.TryGetUInt16(GeoTiffDirectory.TagModelType, out ushort value))
                return null;

            // Requirement 8.4
            // The GTModelTypeGeoKey value SHALL be:
            // * 0 to indicate that the Model CRS in undefined or unknown; or
            // * 1 to indicate that the Model CRS is a 2D projected coordinate reference system, indicated by the value of the ProjectedCRSGeoKey; or
            // * 2 to indicate that the Model CRS is a geographic 2D coordinate reference system, indicated by the value of the GeodeticCRSGeoKey; or
            // * 3 to indicate that the Model CRS is a geocentric Cartesian 3D coordinate reference system, indicated by the value of the GeodeticCRSGeoKey; or
            // * 32767 to indicate that the Model CRS type is user-defined.

            return value switch
            {
                0 => "Undefined",
                1 => "Projected",
                2 => "Geographic",
                3 => "Geocentric",
                32767 => "User Defined",
                _ => "Unknown (" + value + ")"
            };
        }

        public string? GetRasterTypeDescription()
        {
            if (!Directory.TryGetUInt16(GeoTiffDirectory.TagRasterType, out ushort value))
                return null;

            // Requirement 7.3
            // The GTRasterTypeGeoKey value SHALL be:
            // * 0 to indicate that the Raster type is undefined or unknown; or
            // * 1 to indicate that the Raster type is PixelIsArea; or
            // * 2 to indicate that the Raster type is PixelIsPoint; or
            // * 32767 to indicate that the Raster type is user-defined.
            // Recommendation: the use of 0 (undefined) or 32767 (user-defined) is not recommended

            return value switch
            {
                0 => "Undefined",
                1 => "PixelIsArea",
                2 => "PixelIsPoint",
                32767 => "User Defined",
                _ => "Unknown (" + value + ")"
            };
        }

        public string? GetGeographicTypeDescription()
        {
            if (!Directory.TryGetUInt16(GeoTiffDirectory.TagGeographicType, out ushort value))
                return null;

            // Requirement 13.4
            // GeodeticCRSGeoKey values in the range 1024-32766 SHALL be EPSG geographic 2D or geocentric CRS codes
            // NOTE: In GeoTIFF v1.0 the range was 4000-4999. Several values in this range have been deprecated or deleted from the EPSG Dataset and should no longer be used.

            return value switch
            {
                4001 => "Airy 1830",
                4002 => "Airy Modified 1849",
                4003 => "Australian National Spheroid",
                4004 => "Bessel 1841",
                4005 => "Bessel Modified",
                4006 => "Bessel Namibia",
                4007 => "Clarke 1858",
                4008 => "Clarke 1866",
                4009 => "Clarke 1866 Michigan",
                4010 => "Clarke 1880 Benoit",
                4011 => "Clarke 1880 IGN",
                4012 => "Clarke 1880 RGS",
                4013 => "Clarke 1880 Arc",
                4014 => "Clarke 1880 SGA 1922",
                4015 => "Everest 1830 1937 Adjustment",
                4016 => "Everest 1830 1967 Definition",
                4017 => "Everest 1830 1975 Definition",
                4018 => "Everest 1830 Modified",
                4019 => "GRS 1980",
                4020 => "Helmert 1906",
                4021 => "Indonesian National Spheroid",
                4022 => "International 1924",
                4023 => "International 1967",
                4024 => "Krassowsky 1940",
                4025 => "NWL9D",
                4026 => "NWL10D",
                4027 => "Plessis 1817",
                4028 => "Struve 1860",
                4029 => "War Office",
                4030 => "WGS84",
                4031 => "GEM10C",
                4032 => "OSU86F",
                4033 => "OSU91A",
                4034 => "Clarke 1880",
                4035 => "Sphere",
                4053 => "1924 Authalic Sphere",
                4120 => "Greek",
                4121 => "GGRS87",
                4123 => "KKJ",
                4124 => "RT90",
                4133 => "EST92",
                4134 => "PSD93",
                4135 => "Old Hawaiian",
                4136 => "St. Lawrence Island",
                4137 => "St. Paul Island",
                4138 => "St. George Island",
                4139 => "Puerto Rico",
                4141 => "Israel 1993",
                4142 => "Locodjo 1965",
                4143 => "Abidjan 1987",
                4144 => "Kalianpur 1937",
                4145 => "Kalianpur 1962",
                4146 => "Kalianpur 1975",
                4147 => "Hanoi 1972",
                4148 => "Hartebeesthoek94",
                4149 => "CH1903",
                4150 => "CH1903+",
                4151 => "CHTRF95",
                4152 => "NAD83 HARN",
                4153 => "Rassadiran",
                4154 => "ED50 ED77",
                4155 => "Dabola 1981",
                4201 => "Adindan",
                4202 => "AGD66",
                4203 => "AGD84",
                4204 => "Ain el Abd",
                4205 => "Afgooye",
                4206 => "Agadez",
                4207 => "Lisbon",
                4208 => "Aratu",
                4209 => "Arc 1950",
                4210 => "Arc 1960",
                4211 => "Batavia",
                4212 => "Barbados",
                4213 => "Beduaram",
                4214 => "Beijing 1954",
                4215 => "Belge 1950",
                4216 => "Bermuda 1957",
                4217 => "Bern 1898",
                4218 => "Bogota",
                4219 => "Bukit Rimpah",
                4220 => "Camacupa",
                4221 => "Campo Inchauspe",
                4222 => "Cape",
                4223 => "Carthage",
                4224 => "Chua",
                4225 => "Corrego Alegre",
                4226 => "Cote d Ivoire",
                4227 => "Deir ez Zor",
                4228 => "Douala",
                4229 => "Egypt 1907",
                4230 => "ED50",
                4231 => "ED87",
                4232 => "Fahud",
                4233 => "Gandajika 1970",
                4234 => "Garoua",
                4235 => "Guyane Francaise",
                4236 => "Hu Tzu Shan",
                4237 => "HD72",
                4238 => "ID74",
                4239 => "Indian 1954",
                4240 => "Indian 1975",
                4241 => "Jamaica 1875",
                4242 => "JAD69",
                4243 => "Kalianpur",
                4244 => "Kandawala",
                4245 => "Kertau",
                4246 => "KOC",
                4247 => "La Canoa",
                4248 => "PSAD56",
                4249 => "Lake",
                4250 => "Leigon",
                4251 => "Liberia 1964",
                4252 => "Lome",
                4253 => "Luzon 1911",
                4254 => "Hito XVIII 1963",
                4255 => "Herat North",
                4256 => "Mahe 1971",
                4257 => "Makassar",
                4258 => "EUREF89",
                4259 => "Malongo 1987",
                4260 => "Manoca",
                4261 => "Merchich",
                4262 => "Massawa",
                4263 => "Minna",
                4264 => "Mhast",
                4265 => "Monte Mario",
                4266 => "M poraloko",
                4267 => "NAD27",
                4268 => "NAD Michigan",
                4269 => "NAD83",
                4270 => "Nahrwan 1967",
                4271 => "Naparima 1972",
                4272 => "GD49",
                4273 => "NGO 1948",
                4274 => "73",
                4275 => "NTF",
                4276 => "NSWC 9Z 2",
                4277 => "OSGB 1936",
                4278 => "OSGB70",
                4279 => "OS SN80",
                4280 => "Padang",
                4281 => "Palestine 1923",
                4282 => "Pointe Noire",
                4283 => "GDA94",
                4284 => "Pulkovo 1942",
                4285 => "Qatar",
                4286 => "Qatar 1948",
                4287 => "Qornoq",
                4288 => "Loma Quintana",
                4289 => "Amersfoort",
                4290 => "RT38",
                4291 => "SAD69",
                4292 => "Sapper Hill 1943",
                4293 => "Schwarzeck",
                4294 => "Segora",
                4295 => "Serindung",
                4296 => "Sudan",
                4297 => "Tananarive",
                4298 => "Timbalai 1948",
                4299 => "TM65",
                4300 => "TM75",
                4301 => "Tokyo",
                4302 => "Trinidad 1903",
                4303 => "TC 1948",
                4304 => "Voirol 1875",
                4305 => "Voirol Unifie",
                4306 => "Bern 1938",
                4307 => "Nord Sahara 1959",
                4308 => "Stockholm 1938",
                4309 => "Yacare",
                4310 => "Yoff",
                4311 => "Zanderij",
                4312 => "MGI",
                4313 => "Belge 1972",
                4314 => "DHDN",
                4315 => "Conakry 1905",
                4317 => "Dealul Piscului 1970",
                4322 => "WGS 72",
                4324 => "WGS 72BE",
                4326 => "WGS 84",
                4618 => "NAD83 CSRS",
                4619 => "SWEREF99",
                4620 => "Point 58",
                4621 => "Fort Marigot",
                4622 => "Guadeloupe 1948",
                4623 => "CSG67",
                4624 => "RGFG95",
                4625 => "Martinique 1938",
                4626 => "Reunion 1947",
                4627 => "RGR92",
                4628 => "Tahiti 52",
                4629 => "Tahaa 54",
                4630 => "IGN72 Nuku Hiva",
                4632 => "Combani 1950",
                4633 => "IGN56 Lifou",
                4636 => "Petrels 1972",
                4637 => "Perroud 1950",
                4638 => "Saint Pierre et Miquelon 1950",
                4639 => "MOP78",
                4641 => "IGN53 Mare",
                4642 => "ST84 Ile des Pins",
                4643 => "ST71 Belep",
                4644 => "NEA74 Noumea",
                4646 => "Grand Comoros",
                4657 => "Reykjavik 1900",
                4658 => "Hjorsey 1955",
                4659 => "ISN93",
                4660 => "Helle 1954",
                4661 => "LKS92",
                4662 => "IGN72 Grande Terre",
                4663 => "Porto Santo 1995",
                4664 => "Azores Oriental 1995",
                4665 => "Azores Central 1995",
                4666 => "Lisbon 1890",
                4667 => "IKBD-92",
                4668 => "ED79",
                4669 => "LKS94",
                4670 => "IGM95",
                4671 => "Voirol 1879",
                4672 => "Chatham Islands 1971",
                4673 => "Chatham Islands 1979",
                4674 => "SIRGAS 2000",
                4675 => "Guam 1963",
                4676 => "Vientiane 1982",
                4677 => "Lao 1993",
                4678 => "Lao 1997",
                4679 => "Jouik 1961",
                4680 => "Nouakchott 1965",
                4682 => "Gulshan 303",
                4683 => "PRS92",
                4684 => "Gan 1970",
                4760 => "WGS 66",
                4761 => "HTRS96",
                4762 => "BDA2000",
                4763 => "Pitcairn 2006",
                4764 => "RSRGD2000",
                4765 => "Slovenia 1996",
                4801 => "Bern 1898 Bern",
                4802 => "Bogota Bogota",
                4803 => "Lisbon Lisbon",
                4804 => "Makassar Jakarta",
                4805 => "MGI Ferro",
                4806 => "Monte Mario Rome",
                4807 => "NTF Paris",
                4808 => "Padang Jakarta",
                4809 => "Belge 1950 Brussels",
                4810 => "Tananarive Paris",
                4811 => "Voirol 1875 Paris",
                4812 => "Voirol Unifie Paris",
                4813 => "Batavia Jakarta",
                4814 => "RT38 Stockholm",
                4815 => "Greek Athens",
                4816 => "Carthage Paris",
                4817 => "NGO 1948 Oslo",
                4818 => "S-JTSK Ferro",
                4820 => "Segara Jakarta",
                4821 => "Voirol 1879 Paris",
                4823 => "Sao Tome",
                4824 => "Principe",
                4901 => "ATF Paris",
                4902 => "NDG Paris",
                4903 => "Madrid 1870 Madrid",
                4904 => "Lisbon 1890 Lisbon",
                5451 => "Ocotepeque 1935",
                6318 => "NAD83 2011",
                6322 => "NAD83 PA11",
                6325 => "NAD83 MA11",
                6783 => "NAD83 CORS96",
                32767 => "User Defined",
                _ => "Unknown (" + value + ")"
            };
        }

        public string? GetGeodeticDatumDescription()
        {
            if (!Directory.TryGetUInt16(GeoTiffDirectory.TagGeodeticDatum, out ushort value))
                return null;

            // Requirement 18.4
            // GeodeticDatumGeoKey values in the range 1024-32766 SHALL be EPSG geodetic datum codes.
            // NOTE: In GeoTIFF v1.0 the range was 6000-6999. Several values in this range have been deprecated or deleted from the EPSG Dataset and should no longer be used.

            return value switch
            {
                6001 => "Airy 1830",
                6002 => "Airy Modified 1849",
                6003 => "Australian National Spheroid",
                6004 => "Bessel 1841",
                6005 => "Bessel Modified",
                6006 => "Bessel Namibia",
                6007 => "Clarke 1858",
                6008 => "Clarke 1866",
                6009 => "Clarke 1866 Michigan",
                6010 => "Clarke 1880 Benoit",
                6011 => "Clarke 1880 IGN",
                6012 => "Clarke 1880 RGS",
                6013 => "Clarke 1880 Arc",
                6014 => "Clarke 1880 SGA 1922",
                6015 => "Everest 1830 1937 Adjustment",
                6016 => "Everest 1830 1967 Definition",
                6017 => "Everest 1830 1975 Definition",
                6018 => "Everest 1830 Modified",
                6019 => "GRS 1980",
                6020 => "Helmert 1906",
                6021 => "Indonesian National Spheroid",
                6022 => "International 1924",
                6023 => "International 1967",
                6024 => "Krassowsky 1960",
                6025 => "NWL9D",
                6026 => "NWL10D",
                6027 => "Plessis 1817",
                6028 => "Struve 1860",
                6029 => "War Office",
                6030 => "WGS84",
                6031 => "GEM10C",
                6032 => "OSU86F",
                6033 => "OSU91A",
                6034 => "Clarke 1880",
                6035 => "Sphere",
                6201 => "Adindan",
                6202 => "Australian Geodetic Datum 1966",
                6203 => "Australian Geodetic Datum 1984",
                6204 => "Ain el Abd 1970",
                6205 => "Afgooye",
                6206 => "Agadez",
                6207 => "Lisbon",
                6208 => "Aratu",
                6209 => "Arc 1950",
                6210 => "Arc 1960",
                6211 => "Batavia",
                6212 => "Barbados",
                6213 => "Beduaram",
                6214 => "Beijing 1954",
                6215 => "Reseau National Belge 1950",
                6216 => "Bermuda 1957",
                6217 => "Bern 1898",
                6218 => "Bogota",
                6219 => "Bukit Rimpah",
                6220 => "Camacupa",
                6221 => "Campo Inchauspe",
                6222 => "Cape",
                6223 => "Carthage",
                6224 => "Chua",
                6225 => "Corrego Alegre",
                6226 => "Cote d Ivoire",
                6227 => "Deir ez Zor",
                6228 => "Douala",
                6229 => "Egypt 1907",
                6230 => "European Datum 1950",
                6231 => "European Datum 1987",
                6232 => "Fahud",
                6233 => "Gandajika 1970",
                6234 => "Garoua",
                6235 => "Guyane Francaise",
                6236 => "Hu Tzu Shan",
                6237 => "Hungarian Datum 1972",
                6238 => "Indonesian Datum 1974",
                6239 => "Indian 1954",
                6240 => "Indian 1975",
                6241 => "Jamaica 1875",
                6242 => "Jamaica 1969",
                6243 => "Kalianpur",
                6244 => "Kandawala",
                6245 => "Kertau",
                6246 => "Kuwait Oil Company",
                6247 => "La Canoa",
                6248 => "Provisional S American Datum 1956",
                6249 => "Lake",
                6250 => "Leigon",
                6251 => "Liberia 1964",
                6252 => "Lome",
                6253 => "Luzon 1911",
                6254 => "Hito XVIII 1963",
                6255 => "Herat North",
                6256 => "Mahe 1971",
                6257 => "Makassar",
                6258 => "European Reference System 1989",
                6259 => "Malongo 1987",
                6260 => "Manoca",
                6261 => "Merchich",
                6262 => "Massawa",
                6263 => "Minna",
                6264 => "Mhast",
                6265 => "Monte Mario",
                6266 => "M poraloko",
                6267 => "North American Datum 1927",
                6268 => "NAD Michigan",
                6269 => "North American Datum 1983",
                6270 => "Nahrwan 1967",
                6271 => "Naparima 1972",
                6272 => "New Zealand Geodetic Datum 1949",
                6273 => "NGO 1948",
                6274 => "Datum 73",
                6275 => "Nouvelle Triangulation Francaise",
                6276 => "NSWC 9Z 2",
                6277 => "OSGB 1936",
                6278 => "OSGB 1970 SN",
                6279 => "OS SN 1980",
                6280 => "Padang 1884",
                6281 => "Palestine 1923",
                6282 => "Pointe Noire",
                6283 => "Geocentric Datum of Australia 1994",
                6284 => "Pulkovo 1942",
                6285 => "Qatar",
                6286 => "Qatar 1948",
                6287 => "Qornoq",
                6288 => "Loma Quintana",
                6289 => "Amersfoort",
                6290 => "RT38",
                6291 => "South American Datum 1969",
                6292 => "Sapper Hill 1943",
                6293 => "Schwarzeck",
                6294 => "Segora",
                6295 => "Serindung",
                6296 => "Sudan",
                6297 => "Tananarive 1925",
                6298 => "Timbalai 1948",
                6299 => "TM65",
                6300 => "TM75",
                6301 => "Tokyo",
                6302 => "Trinidad 1903",
                6303 => "Trucial Coast 1948",
                6304 => "Voirol 1875",
                6305 => "Voirol Unifie 1960",
                6306 => "Bern 1938",
                6307 => "Nord Sahara 1959",
                6308 => "Stockholm 1938",
                6309 => "Yacare",
                6310 => "Yoff",
                6311 => "Zanderij",
                6312 => "Militar Geographische Institut",
                6313 => "Reseau National Belge 1972",
                6314 => "Deutsche Hauptdreiecksnetz",
                6315 => "Conakry 1905",
                6317 => "Dealul Piscului 1970",
                6322 => "WGS72",
                6324 => "WGS72 Transit Broadcast Ephemeris",
                6326 => "WGS84",
                6742 => "Malaysia 2000",
                6901 => "Ancienne Triangulation Francaise",
                6902 => "Nord de Guerre",
                32767 => "User Defined",
                _ => "Unknown (" + value + ")"
            };
        }

        public string? GetPrimeMeridianDescription()
        {
            if (!Directory.TryGetUInt16(GeoTiffDirectory.TagGeographicPrimeMeridian, out ushort value))
                return null;

            // Requirement 19.4
            // PrimeMeridianGeoKey values in the range 1024-32766 SHALL be EPSG Prime Meridian Codes
            // NOTE: In GeoTIFF v1.0 the range was 8000-8999

            return value switch
            {
                8901 => "Greenwich",
                8902 => "Lisbon",
                8903 => "Paris",
                8904 => "Bogota",
                8905 => "Madrid",
                8906 => "Rome",
                8907 => "Bern",
                8908 => "Jakarta",
                8909 => "Ferro",
                8910 => "Brussels",
                8911 => "Stockholm",
                8912 => "Athens",
                8913 => "Oslo",
                8914 => "Paris RGS",
                32767 => "User Defined",
                _ => "Unknown (" + value + ")"
            };
        }

        public string? GetGeographicEllipsoidDescription()
        {
            if (!Directory.TryGetUInt16(GeoTiffDirectory.TagGeographicEllipsoid, out ushort value))
                return null;

            // Requirement 21.4
            // EllipsoidGeoKey values in the range 1024-32766 SHALL be EPSG ellipsoid Codes
            // NOTE: In GeoTIFF v1.0 the range was 7000-7999. Several values in this range have been deprecated or deleted from the EPSG Dataset and should no longer be used.

            return value switch
            {
                7001 => "Airy 1830",
                7002 => "Airy Modified 1849",
                7003 => "Australian National Spheroid",
                7004 => "Bessel 1841",
                7005 => "Bessel Modified",
                7006 => "Bessel Namibia",
                7007 => "Clarke 1858",
                7008 => "Clarke 1866",
                7009 => "Clarke 1866 Michigan",
                7010 => "Clarke 1880 Benoit",
                7011 => "Clarke 1880 IGN",
                7012 => "Clarke 1880 RGS",
                7013 => "Clarke 1880 Arc",
                7014 => "Clarke 1880 SGA 1922",
                7015 => "Everest 1830 1937 Adjustment",
                7016 => "Everest 1830 1967 Definition",
                7017 => "Everest 1830 1975 Definition",
                7018 => "Everest 1830 Modified",
                7019 => "GRS 1980",
                7020 => "Helmert 1906",
                7021 => "Indonesian National Spheroid",
                7022 => "International 1924",
                7023 => "International 1967",
                7024 => "Krassowsky 1940",
                7025 => "NWL 9D",
                7026 => "NWL 10D",
                7027 => "Plessis 1817",
                7028 => "Struve 1860",
                7029 => "War Office",
                7030 => "WGS 84",
                7031 => "GEM 10C",
                7032 => "OSU86F",
                7033 => "OSU91A",
                7034 => "Clarke 1880",
                7035 => "Sphere",
                7036 => "GRS 1967",
                7041 => "Average Terrestrial System 1977",
                7042 => "Everest 1830",
                7043 => "WGS 72",
                7044 => "Everest 1830 1962 Definition",
                7045 => "Everest 1830 1975 Definition",
                7046 => "Bessel Namibia GLM",
                7047 => "GRS 1980 Authalic Sphere",
                7048 => "GRS 1980 Authalic Sphere",
                7049 => "IAG 1975",
                7050 => "GRS 1967 Modified",
                7051 => "Danish 1876",
                7052 => "Clarke 1866 Authalic Sphere",
                7053 => "Hough 1960",
                7054 => "PZ-90",
                7055 => "Clarke 1880 International Foot",
                7056 => "Everest 1830 RSO 1969",
                7057 => "International 1924 Authalic Sphere",
                7058 => "Hughes 1980",
                7059 => "Popular Visualisation Sphere",
                32767 => "User Defined",
                _ => "Unknown (" + value + ")"
            };
        }

        public string? GetProjectedCoordinateSystemDescription()
        {
            if (!Directory.TryGetUInt16(GeoTiffDirectory.TagProjectedCSType, out ushort value))
                return null;

            // Requirement 12.4
            // ProjectedCRSGeoKey values in the range 1024-32766 SHALL be EPSG Projected CRS Codes
            // NOTE: In GeoTIFF v1.0 the range was 20000-32760. Several values in this range have been deprecated or deleted from the EPSG Dataset and should no longer be used.

            return value switch
            {
                2046 => "Hartebeesthoek94 Lo15",
                2047 => "Hartebeesthoek94 Lo17",
                2048 => "Hartebeesthoek94 Lo19",
                2049 => "Hartebeesthoek94 Lo21",
                2050 => "Hartebeesthoek94 Lo23",
                2051 => "Hartebeesthoek94 Lo25",
                2052 => "Hartebeesthoek94 Lo27",
                2053 => "Hartebeesthoek94 Lo29",
                2054 => "Hartebeesthoek94 Lo31",
                2055 => "Hartebeesthoek94 Lo33",
                2100 => "GGRS87 Greek Grid",
                2176 => "ETRS89 Poland CS2000 zone 5",
                2177 => "ETRS89 Poland CS2000 zone 7",
                2178 => "ETRS89 Poland CS2000 zone 8",
                2180 => "ETRS89 Poland CS92",
                2204 => "NAD27 Tennessee",
                2205 => "NAD83 Kentucky North",
                2391 => "KKJ Finland zone 1",
                2392 => "KKJ Finland zone 2",
                2393 => "KKJ Finland zone 3",
                2394 => "KKJ Finland zone 4",
                2400 => "RT90 2 5 gon W",
                2600 => "Lietuvos Koordinoei Sistema 1994",
                3031 => "WGS 84 Antarctic Polar Stereographic",
                3032 => "WGS 84 Australian Antarctic Polar Stereographic",
                3033 => "WGS 84 Australian Antarctic Lambert",
                3034 => "ETRS89-extended LCC Europe",
                3035 => "ETRS89-extended LAEA Europe",
                3053 => "Hjorsey 1955 Lambert",
                3057 => "ISN93 Lambert 1993",
                3081 => "NAD83 Texas State Mapping System",
                3082 => "NAD83 Texas Centric Lambert Conformal",
                3083 => "NAD83 Texas Centric Albers Equal Area",
                3084 => "NAD83 HARN Texas Centric Lambert Conformal",
                3085 => "NAD83 HARN Texas Centric Albers Equal Area",
                3300 => "Estonian Coordinate System of 1992",
                3407 => "Hong Kong 1963 Grid System",
                3408 => "NSIDC EASE-Grid North",
                3409 => "NSIDC EASE-Grid South",
                3410 => "NSIDC EASE-Grid Global",
                3411 => "NSIDC Sea Ice Polar Stereographic North",
                3412 => "NSIDC Sea Ice Polar Stereographic South",
                3413 => "WGS 84 NSIDC Sea Ice Polar Stereographic North",
                3414 => "SVY21 Singapore TM",
                3786 => "Popular Visualisation CRS / Mercator",
                3812 => "ETRS89 Belgian Lambert 2008",
                3814 => "NAD83 Mississippi TM",
                3815 => "NAD83 HARN Mississippi TM",
                3816 => "NAD83 NSRS2007 Mississippi TM",
                3857 => "WGS 84 / Pseudo-Mercator",
                4087 => "WGS 84 / World Equidistant Cylindrical",
                4088 => "World Equidistant Cylindrical Sphere",
                5329 => "Segara Jakarta NEIEZ",
                5330 => "Batavia Jakarta NEIEZ",
                5331 => "Makassar Jakarta NEIEZ",
                5456 => "Ocotepeque 1935 Costa Rica Norte",
                5457 => "Ocotepeque 1935 Costa Rica Sur",
                5479 => "RSRGD2000 / MSLC2000",
                5480 => "RSRGD2000 / BCLC2000",
                5481 => "RSRGD2000 / PCLC2000",
                5482 => "RSRGD2000 / RSPS2000",
                5588 => "NAD27 New Brunswick Stereographic NAD27",
                5589 => "Sibun Gorge 1922 Colony Grid",
                5641 => "SIRGAS 2000 Brazil Mercator",
                6784 => "NAD83 CORS96 Oregon Baker zone (m)",
                6785 => "NAD83 CORS96 Oregon Baker zone (ft)",
                6786 => "NAD83 2011 Oregon Baker zone (m)",
                6787 => "NAD83 2011 Oregon Baker zone (ft)",
                6788 => "NAD83 CORS96 Oregon Bend-Klamath Falls zone (m)",
                6789 => "NAD83 CORS96 Oregon Bend-Klamath Falls zone (ft)",
                6790 => "NAD83 2011 Oregon Bend-Klamath Falls zone (m)",
                6791 => "NAD83 2011 Oregon Bend-Klamath Falls zone (ft)",
                6792 => "NAD83 CORS96 Oregon Bend-Redmond-Prineville zone (m)",
                6793 => "NAD83 CORS96 Oregon Bend-Redmond-Prineville zone (ft)",
                6794 => "NAD83 2011 Oregon Bend-Redmond-Prineville zone (m)",
                6795 => "NAD83 2011 Oregon Bend-Redmond-Prineville zone (ft)",
                6796 => "NAD83 CORS96 Oregon Bend-Burns zone (m)",
                6797 => "NAD83 CORS96 Oregon Bend-Burns zone (ft)",
                6798 => "NAD83 2011 Oregon Bend-Burns zone (m)",
                6799 => "NAD83 2011 Oregon Bend-Burns zone (ft)",
                6800 => "NAD83 CORS96 Oregon Canyonville-Grants Pass zone (m)",
                6801 => "NAD83 CORS96 Oregon Canyonville-Grants Pass zone (ft)",
                6802 => "NAD83 2011 Oregon Canyonville-Grants Pass zone (m)",
                6803 => "NAD83 2011 Oregon Canyonville-Grants Pass zone (ft)",
                6804 => "NAD83 CORS96 Oregon Columbia River East zone (m)",
                6805 => "NAD83 CORS96 Oregon Columbia River East zone (ft)",
                6806 => "NAD83 2011 Oregon Columbia River East zone (m)",
                6807 => "NAD83 2011 Oregon Columbia River East zone (ft)",
                6808 => "NAD83 CORS96 Oregon Columbia River West zone (m)",
                6809 => "NAD83 CORS96 Oregon Columbia River West zone (ft)",
                6810 => "NAD83 2011 Oregon Columbia River West zone (m)",
                6811 => "NAD83 2011 Oregon Columbia River West zone (ft)",
                6812 => "NAD83 CORS96 Oregon Cottage Grove-Canyonville zone (m)",
                6813 => "NAD83 CORS96 Oregon Cottage Grove-Canyonville zone (ft)",
                6814 => "NAD83 2011 Oregon Cottage Grove-Canyonville zone (m)",
                6815 => "NAD83 2011 Oregon Cottage Grove-Canyonville zone (ft)",
                6816 => "NAD83 CORS96 Oregon Dufur-Madras zone (m)",
                6817 => "NAD83 CORS96 Oregon Dufur-Madras zone (ft)",
                6818 => "NAD83 2011 Oregon Dufur-Madras zone (m)",
                6819 => "NAD83 2011 Oregon Dufur-Madras zone (ft)",
                6820 => "NAD83 CORS96 Oregon Eugene zone (m)",
                6821 => "NAD83 CORS96 Oregon Eugene zone (ft)",
                6822 => "NAD83 2011 Oregon Eugene zone (m)",
                6823 => "NAD83 2011 Oregon Eugene zone (ft)",
                6824 => "NAD83 CORS96 Oregon Grants Pass-Ashland zone (m)",
                6825 => "NAD83 CORS96 Oregon Grants Pass-Ashland zone (ft)",
                6826 => "NAD83 2011 Oregon Grants Pass-Ashland zone (m)",
                6827 => "NAD83 2011 Oregon Grants Pass-Ashland zone (ft)",
                6828 => "NAD83 CORS96 Oregon Gresham-Warm Springs zone (m)",
                6829 => "NAD83 CORS96 Oregon Gresham-Warm Springs zone (ft)",
                6830 => "NAD83 2011 Oregon Gresham-Warm Springs zone (m)",
                6831 => "NAD83 2011 Oregon Gresham-Warm Springs zone (ft)",
                6832 => "NAD83 CORS96 Oregon La Grande zone (m)",
                6833 => "NAD83 CORS96 Oregon La Grande zone (ft)",
                6834 => "NAD83 2011 Oregon La Grande zone (m)",
                6835 => "NAD83 2011 Oregon La Grande zone (ft)",
                6836 => "NAD83 CORS96 Oregon Ontario zone (m)",
                6837 => "NAD83 CORS96 Oregon Ontario zone (ft)",
                6838 => "NAD83 2011 Oregon Ontario zone (m)",
                6839 => "NAD83 2011 Oregon Ontario zone (ft)",
                6840 => "NAD83 CORS96 Oregon Coast zone (m)",
                6841 => "NAD83 CORS96 Oregon Coast zone (ft)",
                6842 => "NAD83 2011 Oregon Coast zone (m)",
                6843 => "NAD83 2011 Oregon Coast zone (ft)",
                6844 => "NAD83 CORS96 Oregon Pendleton zone (m)",
                6845 => "NAD83 CORS96 Oregon Pendleton zone (ft)",
                6846 => "NAD83 2011 Oregon Pendleton zone (m)",
                6847 => "NAD83 2011 Oregon Pendleton zone (ft)",
                6848 => "NAD83 CORS96 Oregon Pendleton-La Grande zone (m)",
                6849 => "NAD83 CORS96 Oregon Pendleton-La Grande zone (ft)",
                6850 => "NAD83 2011 Oregon Pendleton-La Grande zone (m)",
                6851 => "NAD83 2011 Oregon Pendleton-La Grande zone (ft)",
                6852 => "NAD83 CORS96 Oregon Portland zone (m)",
                6853 => "NAD83 CORS96 Oregon Portland zone (ft)",
                6854 => "NAD83 2011 Oregon Portland zone (m)",
                6855 => "NAD83 2011 Oregon Portland zone (ft)",
                6856 => "NAD83 CORS96 Oregon Salem zone (m)",
                6857 => "NAD83 CORS96 Oregon Salem zone (ft)",
                6858 => "NAD83 2011 Oregon Salem zone (m)",
                6859 => "NAD83 2011 Oregon Salem zone (ft)",
                6860 => "NAD83 CORS96 Oregon Santiam Pass zone (m)",
                6861 => "NAD83 CORS96 Oregon Santiam Pass zone (ft)",
                6862 => "NAD83 2011 Oregon Santiam Pass zone (m)",
                6863 => "NAD83 2011 Oregon Santiam Pass zone (ft)",
                8065 => "NAD83 2011 PCCS zone 1 (ft)",
                8066 => "NAD83 2011 PCCS zone 2 (ft)",
                8067 => "NAD83 2011 PCCS zone 3 (ft)",
                8068 => "NAD83 2011 PCCS zone 4 (ft)",
                8441 => "Tananarive Laborde Grid",
                20137 => "Adindan UTM zone 37N",
                20138 => "Adindan UTM zone 38N",
                20248 => "AGD66 AMG zone 48",
                20249 => "AGD66 AMG zone 49",
                20250 => "AGD66 AMG zone 50",
                20251 => "AGD66 AMG zone 51",
                20252 => "AGD66 AMG zone 52",
                20253 => "AGD66 AMG zone 53",
                20254 => "AGD66 AMG zone 54",
                20255 => "AGD66 AMG zone 55",
                20256 => "AGD66 AMG zone 56",
                20257 => "AGD66 AMG zone 57",
                20258 => "AGD66 AMG zone 58",
                20348 => "AGD84 AMG zone 48",
                20349 => "AGD84 AMG zone 49",
                20350 => "AGD84 AMG zone 50",
                20351 => "AGD84 AMG zone 51",
                20352 => "AGD84 AMG zone 52",
                20353 => "AGD84 AMG zone 53",
                20354 => "AGD84 AMG zone 54",
                20355 => "AGD84 AMG zone 55",
                20356 => "AGD84 AMG zone 56",
                20357 => "AGD84 AMG zone 57",
                20358 => "AGD84 AMG zone 58",
                20437 => "Ain el Abd UTM zone 37N",
                20438 => "Ain el Abd UTM zone 38N",
                20439 => "Ain el Abd UTM zone 39N",
                20499 => "Ain el Abd Bahrain Grid",
                20538 => "Afgooye UTM zone 38N",
                20539 => "Afgooye UTM zone 39N",
                20700 => "Lisbon Portuguese Grid",
                20822 => "Aratu UTM zone 22S",
                20823 => "Aratu UTM zone 23S",
                20824 => "Aratu UTM zone 24S",
                20973 => "Arc 1950 Lo13",
                20975 => "Arc 1950 Lo15",
                20977 => "Arc 1950 Lo17",
                20979 => "Arc 1950 Lo19",
                20981 => "Arc 1950 Lo21",
                20983 => "Arc 1950 Lo23",
                20985 => "Arc 1950 Lo25",
                20987 => "Arc 1950 Lo27",
                20989 => "Arc 1950 Lo29",
                20991 => "Arc 1950 Lo31",
                20993 => "Arc 1950 Lo33",
                20995 => "Arc 1950 Lo35",
                21100 => "Batavia NEIEZ",
                21148 => "Batavia UTM zone 48S",
                21149 => "Batavia UTM zone 49S",
                21150 => "Batavia UTM zone 50S",
                21413 => "Beijing Gauss zone 13",
                21414 => "Beijing Gauss zone 14",
                21415 => "Beijing Gauss zone 15",
                21416 => "Beijing Gauss zone 16",
                21417 => "Beijing Gauss zone 17",
                21418 => "Beijing Gauss zone 18",
                21419 => "Beijing Gauss zone 19",
                21420 => "Beijing Gauss zone 20",
                21421 => "Beijing Gauss zone 21",
                21422 => "Beijing Gauss zone 22",
                21423 => "Beijing Gauss zone 23",
                21473 => "Beijing Gauss 13N",
                21474 => "Beijing Gauss 14N",
                21475 => "Beijing Gauss 15N",
                21476 => "Beijing Gauss 16N",
                21477 => "Beijing Gauss 17N",
                21478 => "Beijing Gauss 18N",
                21479 => "Beijing Gauss 19N",
                21480 => "Beijing Gauss 20N",
                21481 => "Beijing Gauss 21N",
                21482 => "Beijing Gauss 22N",
                21483 => "Beijing Gauss 23N",
                21500 => "Belge Lambert 50",
                21790 => "Bern 1898 Swiss Old",
                21817 => "Bogota UTM zone 17N",
                21818 => "Bogota UTM zone 18N",
                21891 => "Bogota Colombia 3W",
                21892 => "Bogota Colombia Bogota",
                21893 => "Bogota Colombia 3E",
                21894 => "Bogota Colombia 6E",
                22032 => "Camacupa UTM 32S",
                22033 => "Camacupa UTM 33S",
                22191 => "C Inchauspe Argentina 1",
                22192 => "C Inchauspe Argentina 2",
                22193 => "C Inchauspe Argentina 3",
                22194 => "C Inchauspe Argentina 4",
                22195 => "C Inchauspe Argentina 5",
                22196 => "C Inchauspe Argentina 6",
                22197 => "C Inchauspe Argentina 7",
                22332 => "Carthage UTM zone 32N",
                22391 => "Carthage Nord Tunisie",
                22392 => "Carthage Sud Tunisie",
                22523 => "Corrego Alegre UTM 23S",
                22524 => "Corrego Alegre UTM 24S",
                22832 => "Douala UTM zone 32N",
                22992 => "Egypt 1907 Red Belt",
                22993 => "Egypt 1907 Purple Belt",
                22994 => "Egypt 1907 Ext Purple",
                23028 => "ED50 UTM zone 28N",
                23029 => "ED50 UTM zone 29N",
                23030 => "ED50 UTM zone 30N",
                23031 => "ED50 UTM zone 31N",
                23032 => "ED50 UTM zone 32N",
                23033 => "ED50 UTM zone 33N",
                23034 => "ED50 UTM zone 34N",
                23035 => "ED50 UTM zone 35N",
                23036 => "ED50 UTM zone 36N",
                23037 => "ED50 UTM zone 37N",
                23038 => "ED50 UTM zone 38N",
                23239 => "Fahud UTM zone 39N",
                23240 => "Fahud UTM zone 40N",
                23433 => "Garoua UTM zone 33N",
                23700 => "HD72 EOV",
                23846 => "ID74 UTM zone 46N",
                23847 => "ID74 UTM zone 47N",
                23848 => "ID74 UTM zone 48N",
                23849 => "ID74 UTM zone 49N",
                23850 => "ID74 UTM zone 50N",
                23851 => "ID74 UTM zone 51N",
                23852 => "ID74 UTM zone 52N",
                23853 => "ID74 UTM zone 53N",
                23886 => "ID74 UTM zone 46S",
                23887 => "ID74 UTM zone 47S",
                23888 => "ID74 UTM zone 48S",
                23889 => "ID74 UTM zone 49S",
                23890 => "ID74 UTM zone 50S",
                23891 => "ID74 UTM zone 51S",
                23892 => "ID74 UTM zone 52S",
                23893 => "ID74 UTM zone 53S",
                23894 => "ID74 UTM zone 54S",
                23947 => "Indian 1954 UTM 47N",
                23948 => "Indian 1954 UTM 48N",
                24047 => "Indian 1975 UTM 47N",
                24048 => "Indian 1975 UTM 48N",
                24100 => "Jamaica 1875 Old Grid",
                24200 => "JAD69 Jamaica Grid",
                24370 => "Kalianpur India 0",
                24371 => "Kalianpur India I",
                24372 => "Kalianpur India IIa",
                24373 => "Kalianpur India IIIa",
                24374 => "Kalianpur India IVa",
                24382 => "Kalianpur India IIb",
                24383 => "Kalianpur India IIIb",
                24384 => "Kalianpur India IVb",
                24500 => "Kertau Singapore Grid",
                24547 => "Kertau UTM zone 47N",
                24548 => "Kertau UTM zone 48N",
                24720 => "La Canoa UTM zone 20N",
                24721 => "La Canoa UTM zone 21N",
                24818 => "PSAD56 UTM zone 18N",
                24819 => "PSAD56 UTM zone 19N",
                24820 => "PSAD56 UTM zone 20N",
                24821 => "PSAD56 UTM zone 21N",
                24877 => "PSAD56 UTM zone 17S",
                24878 => "PSAD56 UTM zone 18S",
                24879 => "PSAD56 UTM zone 19S",
                24880 => "PSAD56 UTM zone 20S",
                24891 => "PSAD56 Peru west zone",
                24892 => "PSAD56 Peru central",
                24893 => "PSAD56 Peru east zone",
                25000 => "Leigon Ghana Grid",
                25231 => "Lome UTM zone 31N",
                25391 => "Luzon Philippines I",
                25392 => "Luzon Philippines II",
                25393 => "Luzon Philippines III",
                25394 => "Luzon Philippines IV",
                25395 => "Luzon Philippines V",
                25700 => "Makassar NEIEZ",
                25932 => "Malongo 1987 UTM 32S",
                26191 => "Merchich Nord Maroc",
                26192 => "Merchich Sud Maroc",
                26193 => "Merchich Sahara",
                26237 => "Massawa UTM zone 37N",
                26331 => "Minna UTM zone 31N",
                26332 => "Minna UTM zone 32N",
                26391 => "Minna Nigeria West",
                26392 => "Minna Nigeria Mid Belt",
                26393 => "Minna Nigeria East",
                26432 => "Mhast UTM zone 32S",
                26591 => "Monte Mario Italy 1",
                26592 => "Monte Mario Italy 2",
                26632 => "M poraloko UTM 32N",
                26692 => "M poraloko UTM 32S",
                26703 => "NAD27 UTM zone 3N",
                26704 => "NAD27 UTM zone 4N",
                26705 => "NAD27 UTM zone 5N",
                26706 => "NAD27 UTM zone 6N",
                26707 => "NAD27 UTM zone 7N",
                26708 => "NAD27 UTM zone 8N",
                26709 => "NAD27 UTM zone 9N",
                26710 => "NAD27 UTM zone 10N",
                26711 => "NAD27 UTM zone 11N",
                26712 => "NAD27 UTM zone 12N",
                26713 => "NAD27 UTM zone 13N",
                26714 => "NAD27 UTM zone 14N",
                26715 => "NAD27 UTM zone 15N",
                26716 => "NAD27 UTM zone 16N",
                26717 => "NAD27 UTM zone 17N",
                26718 => "NAD27 UTM zone 18N",
                26719 => "NAD27 UTM zone 19N",
                26720 => "NAD27 UTM zone 20N",
                26721 => "NAD27 UTM zone 21N",
                26722 => "NAD27 UTM zone 22N",
                26729 => "NAD27 Alabama East",
                26730 => "NAD27 Alabama West",
                26731 => "NAD27 Alaska zone 1",
                26732 => "NAD27 Alaska zone 2",
                26733 => "NAD27 Alaska zone 3",
                26734 => "NAD27 Alaska zone 4",
                26735 => "NAD27 Alaska zone 5",
                26736 => "NAD27 Alaska zone 6",
                26737 => "NAD27 Alaska zone 7",
                26738 => "NAD27 Alaska zone 8",
                26739 => "NAD27 Alaska zone 9",
                26740 => "NAD27 Alaska zone 10",
                26741 => "NAD27 California I",
                26742 => "NAD27 California II",
                26743 => "NAD27 California III",
                26744 => "NAD27 California IV",
                26745 => "NAD27 California V",
                26746 => "NAD27 California VI",
                26747 => "NAD27 California VII",
                26748 => "NAD27 Arizona East",
                26749 => "NAD27 Arizona Central",
                26750 => "NAD27 Arizona West",
                26751 => "NAD27 Arkansas North",
                26752 => "NAD27 Arkansas South",
                26753 => "NAD27 Colorado North",
                26754 => "NAD27 Colorado Central",
                26755 => "NAD27 Colorado South",
                26756 => "NAD27 Connecticut",
                26757 => "NAD27 Delaware",
                26758 => "NAD27 Florida East",
                26759 => "NAD27 Florida West",
                26760 => "NAD27 Florida North",
                26761 => "NAD27 Hawaii zone 1",
                26762 => "NAD27 Hawaii zone 2",
                26763 => "NAD27 Hawaii zone 3",
                26764 => "NAD27 Hawaii zone 4",
                26765 => "NAD27 Hawaii zone 5",
                26766 => "NAD27 Georgia East",
                26767 => "NAD27 Georgia West",
                26768 => "NAD27 Idaho East",
                26769 => "NAD27 Idaho Central",
                26770 => "NAD27 Idaho West",
                26771 => "NAD27 Illinois East",
                26772 => "NAD27 Illinois West",
                26773 => "NAD27 Indiana East",
                26774 => "NAD27 Indiana West",
                26775 => "NAD27 Iowa North",
                26776 => "NAD27 Iowa South",
                26777 => "NAD27 Kansas North",
                26778 => "NAD27 Kansas South",
                26779 => "NAD27 Kentucky North",
                26780 => "NAD27 Kentucky South",
                26781 => "NAD27 Louisiana North",
                26782 => "NAD27 Louisiana South",
                26783 => "NAD27 Maine East",
                26784 => "NAD27 Maine West",
                26785 => "NAD27 Maryland",
                26786 => "NAD27 Massachusetts",
                26787 => "NAD27 Massachusetts Is",
                26788 => "NAD27 Michigan North",
                26789 => "NAD27 Michigan Central",
                26790 => "NAD27 Michigan South",
                26791 => "NAD27 Minnesota North",
                26792 => "NAD27 Minnesota Cent",
                26793 => "NAD27 Minnesota South",
                26794 => "NAD27 Mississippi East",
                26795 => "NAD27 Mississippi West",
                26796 => "NAD27 Missouri East",
                26797 => "NAD27 Missouri Central",
                26798 => "NAD27 Missouri West",
                26801 => "NAD Michigan Michigan East",
                26802 => "NAD Michigan Michigan Old Central",
                26803 => "NAD Michigan Michigan West",
                26903 => "NAD83 UTM zone 3N",
                26904 => "NAD83 UTM zone 4N",
                26905 => "NAD83 UTM zone 5N",
                26906 => "NAD83 UTM zone 6N",
                26907 => "NAD83 UTM zone 7N",
                26908 => "NAD83 UTM zone 8N",
                26909 => "NAD83 UTM zone 9N",
                26910 => "NAD83 UTM zone 10N",
                26911 => "NAD83 UTM zone 11N",
                26912 => "NAD83 UTM zone 12N",
                26913 => "NAD83 UTM zone 13N",
                26914 => "NAD83 UTM zone 14N",
                26915 => "NAD83 UTM zone 15N",
                26916 => "NAD83 UTM zone 16N",
                26917 => "NAD83 UTM zone 17N",
                26918 => "NAD83 UTM zone 18N",
                26919 => "NAD83 UTM zone 19N",
                26920 => "NAD83 UTM zone 20N",
                26921 => "NAD83 UTM zone 21N",
                26922 => "NAD83 UTM zone 22N",
                26923 => "NAD83 UTM zone 23N",
                26929 => "NAD83 Alabama East",
                26930 => "NAD83 Alabama West",
                26931 => "NAD83 Alaska zone 1",
                26932 => "NAD83 Alaska zone 2",
                26933 => "NAD83 Alaska zone 3",
                26934 => "NAD83 Alaska zone 4",
                26935 => "NAD83 Alaska zone 5",
                26936 => "NAD83 Alaska zone 6",
                26937 => "NAD83 Alaska zone 7",
                26938 => "NAD83 Alaska zone 8",
                26939 => "NAD83 Alaska zone 9",
                26940 => "NAD83 Alaska zone 10",
                26941 => "NAD83 California 1",
                26942 => "NAD83 California 2",
                26943 => "NAD83 California 3",
                26944 => "NAD83 California 4",
                26945 => "NAD83 California 5",
                26946 => "NAD83 California 6",
                26948 => "NAD83 Arizona East",
                26949 => "NAD83 Arizona Central",
                26950 => "NAD83 Arizona West",
                26951 => "NAD83 Arkansas North",
                26952 => "NAD83 Arkansas South",
                26953 => "NAD83 Colorado North",
                26954 => "NAD83 Colorado Central",
                26955 => "NAD83 Colorado South",
                26956 => "NAD83 Connecticut",
                26957 => "NAD83 Delaware",
                26958 => "NAD83 Florida East",
                26959 => "NAD83 Florida West",
                26960 => "NAD83 Florida North",
                26961 => "NAD83 Hawaii zone 1",
                26962 => "NAD83 Hawaii zone 2",
                26963 => "NAD83 Hawaii zone 3",
                26964 => "NAD83 Hawaii zone 4",
                26965 => "NAD83 Hawaii zone 5",
                26966 => "NAD83 Georgia East",
                26967 => "NAD83 Georgia West",
                26968 => "NAD83 Idaho East",
                26969 => "NAD83 Idaho Central",
                26970 => "NAD83 Idaho West",
                26971 => "NAD83 Illinois East",
                26972 => "NAD83 Illinois West",
                26973 => "NAD83 Indiana East",
                26974 => "NAD83 Indiana West",
                26975 => "NAD83 Iowa North",
                26976 => "NAD83 Iowa South",
                26977 => "NAD83 Kansas North",
                26978 => "NAD83 Kansas South",
                26979 => "NAD83 Kentucky North",
                26980 => "NAD83 Kentucky South",
                26981 => "NAD83 Louisiana North",
                26982 => "NAD83 Louisiana South",
                26983 => "NAD83 Maine East",
                26984 => "NAD83 Maine West",
                26985 => "NAD83 Maryland",
                26986 => "NAD83 Massachusetts",
                26987 => "NAD83 Massachusetts Is",
                26988 => "NAD83 Michigan North",
                26989 => "NAD83 Michigan Central",
                26990 => "NAD83 Michigan South",
                26991 => "NAD83 Minnesota North",
                26992 => "NAD83 Minnesota Cent",
                26993 => "NAD83 Minnesota South",
                26994 => "NAD83 Mississippi East",
                26995 => "NAD83 Mississippi West",
                26996 => "NAD83 Missouri East",
                26997 => "NAD83 Missouri Central",
                26998 => "NAD83 Missouri West",
                27038 => "Nahrwan 1967 UTM 38N",
                27039 => "Nahrwan 1967 UTM 39N",
                27040 => "Nahrwan 1967 UTM 40N",
                27120 => "Naparima UTM 20N",
                27200 => "GD49 NZ Map Grid",
                27291 => "GD49 North Island Grid",
                27292 => "GD49 South Island Grid",
                27429 => "Datum 73 UTM zone 29N",
                27500 => "ATF Nord de Guerre",
                27581 => "NTF France I",
                27582 => "NTF France II",
                27583 => "NTF France III",
                27591 => "NTF Nord France",
                27592 => "NTF Centre France",
                27593 => "NTF Sud France",
                27700 => "British National Grid",
                28232 => "Point Noire UTM 32S",
                28348 => "GDA94 MGA zone 48",
                28349 => "GDA94 MGA zone 49",
                28350 => "GDA94 MGA zone 50",
                28351 => "GDA94 MGA zone 51",
                28352 => "GDA94 MGA zone 52",
                28353 => "GDA94 MGA zone 53",
                28354 => "GDA94 MGA zone 54",
                28355 => "GDA94 MGA zone 55",
                28356 => "GDA94 MGA zone 56",
                28357 => "GDA94 MGA zone 57",
                28358 => "GDA94 MGA zone 58",
                28404 => "Pulkovo Gauss zone 4",
                28405 => "Pulkovo Gauss zone 5",
                28406 => "Pulkovo Gauss zone 6",
                28407 => "Pulkovo Gauss zone 7",
                28408 => "Pulkovo Gauss zone 8",
                28409 => "Pulkovo Gauss zone 9",
                28410 => "Pulkovo Gauss zone 10",
                28411 => "Pulkovo Gauss zone 11",
                28412 => "Pulkovo Gauss zone 12",
                28413 => "Pulkovo Gauss zone 13",
                28414 => "Pulkovo Gauss zone 14",
                28415 => "Pulkovo Gauss zone 15",
                28416 => "Pulkovo Gauss zone 16",
                28417 => "Pulkovo Gauss zone 17",
                28418 => "Pulkovo Gauss zone 18",
                28419 => "Pulkovo Gauss zone 19",
                28420 => "Pulkovo Gauss zone 20",
                28421 => "Pulkovo Gauss zone 21",
                28422 => "Pulkovo Gauss zone 22",
                28423 => "Pulkovo Gauss zone 23",
                28424 => "Pulkovo Gauss zone 24",
                28425 => "Pulkovo Gauss zone 25",
                28426 => "Pulkovo Gauss zone 26",
                28427 => "Pulkovo Gauss zone 27",
                28428 => "Pulkovo Gauss zone 28",
                28429 => "Pulkovo Gauss zone 29",
                28430 => "Pulkovo Gauss zone 30",
                28431 => "Pulkovo Gauss zone 31",
                28432 => "Pulkovo Gauss zone 32",
                28464 => "Pulkovo Gauss 4N",
                28465 => "Pulkovo Gauss 5N",
                28466 => "Pulkovo Gauss 6N",
                28467 => "Pulkovo Gauss 7N",
                28468 => "Pulkovo Gauss 8N",
                28469 => "Pulkovo Gauss 9N",
                28470 => "Pulkovo Gauss 10N",
                28471 => "Pulkovo Gauss 11N",
                28472 => "Pulkovo Gauss 12N",
                28473 => "Pulkovo Gauss 13N",
                28474 => "Pulkovo Gauss 14N",
                28475 => "Pulkovo Gauss 15N",
                28476 => "Pulkovo Gauss 16N",
                28477 => "Pulkovo Gauss 17N",
                28478 => "Pulkovo Gauss 18N",
                28479 => "Pulkovo Gauss 19N",
                28480 => "Pulkovo Gauss 20N",
                28481 => "Pulkovo Gauss 21N",
                28482 => "Pulkovo Gauss 22N",
                28483 => "Pulkovo Gauss 23N",
                28484 => "Pulkovo Gauss 24N",
                28485 => "Pulkovo Gauss 25N",
                28486 => "Pulkovo Gauss 26N",
                28487 => "Pulkovo Gauss 27N",
                28488 => "Pulkovo Gauss 28N",
                28489 => "Pulkovo Gauss 29N",
                28490 => "Pulkovo Gauss 30N",
                28491 => "Pulkovo Gauss 31N",
                28492 => "Pulkovo Gauss 32N",
                28600 => "Qatar National Grid",
                28991 => "RD Netherlands Old",
                28992 => "RD Netherlands New",
                29101 => "SAD69 Brazil Polyconic",
                29118 => "SAD69 UTM zone 18N",
                29119 => "SAD69 UTM zone 19N",
                29120 => "SAD69 UTM zone 20N",
                29121 => "SAD69 UTM zone 21N",
                29122 => "SAD69 UTM zone 22N",
                29177 => "SAD69 UTM zone 17S",
                29178 => "SAD69 UTM zone 18S",
                29179 => "SAD69 UTM zone 19S",
                29180 => "SAD69 UTM zone 20S",
                29181 => "SAD69 UTM zone 21S",
                29182 => "SAD69 UTM zone 22S",
                29183 => "SAD69 UTM zone 23S",
                29184 => "SAD69 UTM zone 24S",
                29185 => "SAD69 UTM zone 25S",
                29220 => "Sapper Hill UTM 20S",
                29221 => "Sapper Hill UTM 21S",
                29333 => "Schwarzeck UTM 33S",
                29635 => "Sudan UTM zone 35N",
                29636 => "Sudan UTM zone 36N",
                29700 => "Tananarive Laborde",
                29738 => "Tananarive UTM 38S",
                29739 => "Tananarive UTM 39S",
                29800 => "Timbalai 1948 Borneo",
                29849 => "Timbalai 1948 UTM 49N",
                29850 => "Timbalai 1948 UTM 50N",
                29900 => "TM65 Irish Nat Grid",
                30200 => "Trinidad 1903 Trinidad",
                30339 => "TC 1948 UTM zone 39N",
                30340 => "TC 1948 UTM zone 40N",
                30491 => "Voirol N Algerie ancien",
                30492 => "Voirol S Algerie ancien",
                30591 => "Voirol Unifie N Algerie",
                30592 => "Voirol Unifie S Algerie",
                30600 => "Bern 1938 Swiss New",
                30729 => "Nord Sahara UTM 29N",
                30730 => "Nord Sahara UTM 30N",
                30731 => "Nord Sahara UTM 31N",
                30732 => "Nord Sahara UTM 32N",
                31028 => "Yoff UTM zone 28N",
                31121 => "Zanderij UTM zone 21N",
                31291 => "MGI Austria West",
                31292 => "MGI Austria Central",
                31293 => "MGI Austria East",
                31300 => "Belge Lambert 72",
                31491 => "DHDN Germany zone 1",
                31492 => "DHDN Germany zone 2",
                31493 => "DHDN Germany zone 3",
                31494 => "DHDN Germany zone 4",
                31495 => "DHDN Germany zone 5",
                31700 => "Dealul Piscului 1970 Stereo 70",
                32001 => "NAD27 Montana North",
                32002 => "NAD27 Montana Central",
                32003 => "NAD27 Montana South",
                32005 => "NAD27 Nebraska North",
                32006 => "NAD27 Nebraska South",
                32007 => "NAD27 Nevada East",
                32008 => "NAD27 Nevada Central",
                32009 => "NAD27 Nevada West",
                32010 => "NAD27 New Hampshire",
                32011 => "NAD27 New Jersey",
                32012 => "NAD27 New Mexico East",
                32013 => "NAD27 New Mexico Cent",
                32014 => "NAD27 New Mexico West",
                32015 => "NAD27 New York East",
                32016 => "NAD27 New York Central",
                32017 => "NAD27 New York West",
                32018 => "NAD27 New York Long Is",
                32019 => "NAD27 North Carolina",
                32020 => "NAD27 North Dakota N",
                32021 => "NAD27 North Dakota S",
                32022 => "NAD27 Ohio North",
                32023 => "NAD27 Ohio South",
                32024 => "NAD27 Oklahoma North",
                32025 => "NAD27 Oklahoma South",
                32026 => "NAD27 Oregon North",
                32027 => "NAD27 Oregon South",
                32028 => "NAD27 Pennsylvania N",
                32029 => "NAD27 Pennsylvania S",
                32030 => "NAD27 Rhode Island",
                32031 => "NAD27 South Carolina N",
                32033 => "NAD27 South Carolina S",
                32034 => "NAD27 South Dakota N",
                32035 => "NAD27 South Dakota S",
                32036 => "NAD27 Tennessee",
                32037 => "NAD27 Texas North",
                32038 => "NAD27 Texas North Cen",
                32039 => "NAD27 Texas Central",
                32040 => "NAD27 Texas South Cen",
                32041 => "NAD27 Texas South",
                32042 => "NAD27 Utah North",
                32043 => "NAD27 Utah Central",
                32044 => "NAD27 Utah South",
                32045 => "NAD27 Vermont",
                32046 => "NAD27 Virginia North",
                32047 => "NAD27 Virginia South",
                32048 => "NAD27 Washington North",
                32049 => "NAD27 Washington South",
                32050 => "NAD27 West Virginia N",
                32051 => "NAD27 West Virginia S",
                32052 => "NAD27 Wisconsin North",
                32053 => "NAD27 Wisconsin Cen",
                32054 => "NAD27 Wisconsin South",
                32055 => "NAD27 Wyoming East",
                32056 => "NAD27 Wyoming E Cen",
                32057 => "NAD27 Wyoming W Cen",
                32058 => "NAD27 Wyoming West",
                32059 => "NAD27 Puerto Rico",
                32060 => "NAD27 St Croix",
                32100 => "NAD83 Montana",
                32104 => "NAD83 Nebraska",
                32107 => "NAD83 Nevada East",
                32108 => "NAD83 Nevada Central",
                32109 => "NAD83 Nevada West",
                32110 => "NAD83 New Hampshire",
                32111 => "NAD83 New Jersey",
                32112 => "NAD83 New Mexico East",
                32113 => "NAD83 New Mexico Cent",
                32114 => "NAD83 New Mexico West",
                32115 => "NAD83 New York East",
                32116 => "NAD83 New York Central",
                32117 => "NAD83 New York West",
                32118 => "NAD83 New York Long Is",
                32119 => "NAD83 North Carolina",
                32120 => "NAD83 North Dakota N",
                32121 => "NAD83 North Dakota S",
                32122 => "NAD83 Ohio North",
                32123 => "NAD83 Ohio South",
                32124 => "NAD83 Oklahoma North",
                32125 => "NAD83 Oklahoma South",
                32126 => "NAD83 Oregon North",
                32127 => "NAD83 Oregon South",
                32128 => "NAD83 Pennsylvania N",
                32129 => "NAD83 Pennsylvania S",
                32130 => "NAD83 Rhode Island",
                32133 => "NAD83 South Carolina",
                32134 => "NAD83 South Dakota N",
                32135 => "NAD83 South Dakota S",
                32136 => "NAD83 Tennessee",
                32137 => "NAD83 Texas North",
                32138 => "NAD83 Texas North Cen",
                32139 => "NAD83 Texas Central",
                32140 => "NAD83 Texas South Cen",
                32141 => "NAD83 Texas South",
                32142 => "NAD83 Utah North",
                32143 => "NAD83 Utah Central",
                32144 => "NAD83 Utah South",
                32145 => "NAD83 Vermont",
                32146 => "NAD83 Virginia North",
                32147 => "NAD83 Virginia South",
                32148 => "NAD83 Washington North",
                32149 => "NAD83 Washington South",
                32150 => "NAD83 West Virginia N",
                32151 => "NAD83 West Virginia S",
                32152 => "NAD83 Wisconsin North",
                32153 => "NAD83 Wisconsin Cen",
                32154 => "NAD83 Wisconsin South",
                32155 => "NAD83 Wyoming East",
                32156 => "NAD83 Wyoming E Cen",
                32157 => "NAD83 Wyoming W Cen",
                32158 => "NAD83 Wyoming West",
                32161 => "NAD83 Puerto Rico Virgin Is",
                32201 => "WGS72 UTM zone 1N",
                32202 => "WGS72 UTM zone 2N",
                32203 => "WGS72 UTM zone 3N",
                32204 => "WGS72 UTM zone 4N",
                32205 => "WGS72 UTM zone 5N",
                32206 => "WGS72 UTM zone 6N",
                32207 => "WGS72 UTM zone 7N",
                32208 => "WGS72 UTM zone 8N",
                32209 => "WGS72 UTM zone 9N",
                32210 => "WGS72 UTM zone 10N",
                32211 => "WGS72 UTM zone 11N",
                32212 => "WGS72 UTM zone 12N",
                32213 => "WGS72 UTM zone 13N",
                32214 => "WGS72 UTM zone 14N",
                32215 => "WGS72 UTM zone 15N",
                32216 => "WGS72 UTM zone 16N",
                32217 => "WGS72 UTM zone 17N",
                32218 => "WGS72 UTM zone 18N",
                32219 => "WGS72 UTM zone 19N",
                32220 => "WGS72 UTM zone 20N",
                32221 => "WGS72 UTM zone 21N",
                32222 => "WGS72 UTM zone 22N",
                32223 => "WGS72 UTM zone 23N",
                32224 => "WGS72 UTM zone 24N",
                32225 => "WGS72 UTM zone 25N",
                32226 => "WGS72 UTM zone 26N",
                32227 => "WGS72 UTM zone 27N",
                32228 => "WGS72 UTM zone 28N",
                32229 => "WGS72 UTM zone 29N",
                32230 => "WGS72 UTM zone 30N",
                32231 => "WGS72 UTM zone 31N",
                32232 => "WGS72 UTM zone 32N",
                32233 => "WGS72 UTM zone 33N",
                32234 => "WGS72 UTM zone 34N",
                32235 => "WGS72 UTM zone 35N",
                32236 => "WGS72 UTM zone 36N",
                32237 => "WGS72 UTM zone 37N",
                32238 => "WGS72 UTM zone 38N",
                32239 => "WGS72 UTM zone 39N",
                32240 => "WGS72 UTM zone 40N",
                32241 => "WGS72 UTM zone 41N",
                32242 => "WGS72 UTM zone 42N",
                32243 => "WGS72 UTM zone 43N",
                32244 => "WGS72 UTM zone 44N",
                32245 => "WGS72 UTM zone 45N",
                32246 => "WGS72 UTM zone 46N",
                32247 => "WGS72 UTM zone 47N",
                32248 => "WGS72 UTM zone 48N",
                32249 => "WGS72 UTM zone 49N",
                32250 => "WGS72 UTM zone 50N",
                32251 => "WGS72 UTM zone 51N",
                32252 => "WGS72 UTM zone 52N",
                32253 => "WGS72 UTM zone 53N",
                32254 => "WGS72 UTM zone 54N",
                32255 => "WGS72 UTM zone 55N",
                32256 => "WGS72 UTM zone 56N",
                32257 => "WGS72 UTM zone 57N",
                32258 => "WGS72 UTM zone 58N",
                32259 => "WGS72 UTM zone 59N",
                32260 => "WGS72 UTM zone 60N",
                32301 => "WGS72 UTM zone 1S",
                32302 => "WGS72 UTM zone 2S",
                32303 => "WGS72 UTM zone 3S",
                32304 => "WGS72 UTM zone 4S",
                32305 => "WGS72 UTM zone 5S",
                32306 => "WGS72 UTM zone 6S",
                32307 => "WGS72 UTM zone 7S",
                32308 => "WGS72 UTM zone 8S",
                32309 => "WGS72 UTM zone 9S",
                32310 => "WGS72 UTM zone 10S",
                32311 => "WGS72 UTM zone 11S",
                32312 => "WGS72 UTM zone 12S",
                32313 => "WGS72 UTM zone 13S",
                32314 => "WGS72 UTM zone 14S",
                32315 => "WGS72 UTM zone 15S",
                32316 => "WGS72 UTM zone 16S",
                32317 => "WGS72 UTM zone 17S",
                32318 => "WGS72 UTM zone 18S",
                32319 => "WGS72 UTM zone 19S",
                32320 => "WGS72 UTM zone 20S",
                32321 => "WGS72 UTM zone 21S",
                32322 => "WGS72 UTM zone 22S",
                32323 => "WGS72 UTM zone 23S",
                32324 => "WGS72 UTM zone 24S",
                32325 => "WGS72 UTM zone 25S",
                32326 => "WGS72 UTM zone 26S",
                32327 => "WGS72 UTM zone 27S",
                32328 => "WGS72 UTM zone 28S",
                32329 => "WGS72 UTM zone 29S",
                32330 => "WGS72 UTM zone 30S",
                32331 => "WGS72 UTM zone 31S",
                32332 => "WGS72 UTM zone 32S",
                32333 => "WGS72 UTM zone 33S",
                32334 => "WGS72 UTM zone 34S",
                32335 => "WGS72 UTM zone 35S",
                32336 => "WGS72 UTM zone 36S",
                32337 => "WGS72 UTM zone 37S",
                32338 => "WGS72 UTM zone 38S",
                32339 => "WGS72 UTM zone 39S",
                32340 => "WGS72 UTM zone 40S",
                32341 => "WGS72 UTM zone 41S",
                32342 => "WGS72 UTM zone 42S",
                32343 => "WGS72 UTM zone 43S",
                32344 => "WGS72 UTM zone 44S",
                32345 => "WGS72 UTM zone 45S",
                32346 => "WGS72 UTM zone 46S",
                32347 => "WGS72 UTM zone 47S",
                32348 => "WGS72 UTM zone 48S",
                32349 => "WGS72 UTM zone 49S",
                32350 => "WGS72 UTM zone 50S",
                32351 => "WGS72 UTM zone 51S",
                32352 => "WGS72 UTM zone 52S",
                32353 => "WGS72 UTM zone 53S",
                32354 => "WGS72 UTM zone 54S",
                32355 => "WGS72 UTM zone 55S",
                32356 => "WGS72 UTM zone 56S",
                32357 => "WGS72 UTM zone 57S",
                32358 => "WGS72 UTM zone 58S",
                32359 => "WGS72 UTM zone 59S",
                32360 => "WGS72 UTM zone 60S",
                32401 => "WGS72BE UTM zone 1N",
                32402 => "WGS72BE UTM zone 2N",
                32403 => "WGS72BE UTM zone 3N",
                32404 => "WGS72BE UTM zone 4N",
                32405 => "WGS72BE UTM zone 5N",
                32406 => "WGS72BE UTM zone 6N",
                32407 => "WGS72BE UTM zone 7N",
                32408 => "WGS72BE UTM zone 8N",
                32409 => "WGS72BE UTM zone 9N",
                32410 => "WGS72BE UTM zone 10N",
                32411 => "WGS72BE UTM zone 11N",
                32412 => "WGS72BE UTM zone 12N",
                32413 => "WGS72BE UTM zone 13N",
                32414 => "WGS72BE UTM zone 14N",
                32415 => "WGS72BE UTM zone 15N",
                32416 => "WGS72BE UTM zone 16N",
                32417 => "WGS72BE UTM zone 17N",
                32418 => "WGS72BE UTM zone 18N",
                32419 => "WGS72BE UTM zone 19N",
                32420 => "WGS72BE UTM zone 20N",
                32421 => "WGS72BE UTM zone 21N",
                32422 => "WGS72BE UTM zone 22N",
                32423 => "WGS72BE UTM zone 23N",
                32424 => "WGS72BE UTM zone 24N",
                32425 => "WGS72BE UTM zone 25N",
                32426 => "WGS72BE UTM zone 26N",
                32427 => "WGS72BE UTM zone 27N",
                32428 => "WGS72BE UTM zone 28N",
                32429 => "WGS72BE UTM zone 29N",
                32430 => "WGS72BE UTM zone 30N",
                32431 => "WGS72BE UTM zone 31N",
                32432 => "WGS72BE UTM zone 32N",
                32433 => "WGS72BE UTM zone 33N",
                32434 => "WGS72BE UTM zone 34N",
                32435 => "WGS72BE UTM zone 35N",
                32436 => "WGS72BE UTM zone 36N",
                32437 => "WGS72BE UTM zone 37N",
                32438 => "WGS72BE UTM zone 38N",
                32439 => "WGS72BE UTM zone 39N",
                32440 => "WGS72BE UTM zone 40N",
                32441 => "WGS72BE UTM zone 41N",
                32442 => "WGS72BE UTM zone 42N",
                32443 => "WGS72BE UTM zone 43N",
                32444 => "WGS72BE UTM zone 44N",
                32445 => "WGS72BE UTM zone 45N",
                32446 => "WGS72BE UTM zone 46N",
                32447 => "WGS72BE UTM zone 47N",
                32448 => "WGS72BE UTM zone 48N",
                32449 => "WGS72BE UTM zone 49N",
                32450 => "WGS72BE UTM zone 50N",
                32451 => "WGS72BE UTM zone 51N",
                32452 => "WGS72BE UTM zone 52N",
                32453 => "WGS72BE UTM zone 53N",
                32454 => "WGS72BE UTM zone 54N",
                32455 => "WGS72BE UTM zone 55N",
                32456 => "WGS72BE UTM zone 56N",
                32457 => "WGS72BE UTM zone 57N",
                32458 => "WGS72BE UTM zone 58N",
                32459 => "WGS72BE UTM zone 59N",
                32460 => "WGS72BE UTM zone 60N",
                32501 => "WGS72BE UTM zone 1S",
                32502 => "WGS72BE UTM zone 2S",
                32503 => "WGS72BE UTM zone 3S",
                32504 => "WGS72BE UTM zone 4S",
                32505 => "WGS72BE UTM zone 5S",
                32506 => "WGS72BE UTM zone 6S",
                32507 => "WGS72BE UTM zone 7S",
                32508 => "WGS72BE UTM zone 8S",
                32509 => "WGS72BE UTM zone 9S",
                32510 => "WGS72BE UTM zone 10S",
                32511 => "WGS72BE UTM zone 11S",
                32512 => "WGS72BE UTM zone 12S",
                32513 => "WGS72BE UTM zone 13S",
                32514 => "WGS72BE UTM zone 14S",
                32515 => "WGS72BE UTM zone 15S",
                32516 => "WGS72BE UTM zone 16S",
                32517 => "WGS72BE UTM zone 17S",
                32518 => "WGS72BE UTM zone 18S",
                32519 => "WGS72BE UTM zone 19S",
                32520 => "WGS72BE UTM zone 20S",
                32521 => "WGS72BE UTM zone 21S",
                32522 => "WGS72BE UTM zone 22S",
                32523 => "WGS72BE UTM zone 23S",
                32524 => "WGS72BE UTM zone 24S",
                32525 => "WGS72BE UTM zone 25S",
                32526 => "WGS72BE UTM zone 26S",
                32527 => "WGS72BE UTM zone 27S",
                32528 => "WGS72BE UTM zone 28S",
                32529 => "WGS72BE UTM zone 29S",
                32530 => "WGS72BE UTM zone 30S",
                32531 => "WGS72BE UTM zone 31S",
                32532 => "WGS72BE UTM zone 32S",
                32533 => "WGS72BE UTM zone 33S",
                32534 => "WGS72BE UTM zone 34S",
                32535 => "WGS72BE UTM zone 35S",
                32536 => "WGS72BE UTM zone 36S",
                32537 => "WGS72BE UTM zone 37S",
                32538 => "WGS72BE UTM zone 38S",
                32539 => "WGS72BE UTM zone 39S",
                32540 => "WGS72BE UTM zone 40S",
                32541 => "WGS72BE UTM zone 41S",
                32542 => "WGS72BE UTM zone 42S",
                32543 => "WGS72BE UTM zone 43S",
                32544 => "WGS72BE UTM zone 44S",
                32545 => "WGS72BE UTM zone 45S",
                32546 => "WGS72BE UTM zone 46S",
                32547 => "WGS72BE UTM zone 47S",
                32548 => "WGS72BE UTM zone 48S",
                32549 => "WGS72BE UTM zone 49S",
                32550 => "WGS72BE UTM zone 50S",
                32551 => "WGS72BE UTM zone 51S",
                32552 => "WGS72BE UTM zone 52S",
                32553 => "WGS72BE UTM zone 53S",
                32554 => "WGS72BE UTM zone 54S",
                32555 => "WGS72BE UTM zone 55S",
                32556 => "WGS72BE UTM zone 56S",
                32557 => "WGS72BE UTM zone 57S",
                32558 => "WGS72BE UTM zone 58S",
                32559 => "WGS72BE UTM zone 59S",
                32560 => "WGS72BE UTM zone 60S",
                32601 => "WGS84 UTM zone 1N",
                32602 => "WGS84 UTM zone 2N",
                32603 => "WGS84 UTM zone 3N",
                32604 => "WGS84 UTM zone 4N",
                32605 => "WGS84 UTM zone 5N",
                32606 => "WGS84 UTM zone 6N",
                32607 => "WGS84 UTM zone 7N",
                32608 => "WGS84 UTM zone 8N",
                32609 => "WGS84 UTM zone 9N",
                32610 => "WGS84 UTM zone 10N",
                32611 => "WGS84 UTM zone 11N",
                32612 => "WGS84 UTM zone 12N",
                32613 => "WGS84 UTM zone 13N",
                32614 => "WGS84 UTM zone 14N",
                32615 => "WGS84 UTM zone 15N",
                32616 => "WGS84 UTM zone 16N",
                32617 => "WGS84 UTM zone 17N",
                32618 => "WGS84 UTM zone 18N",
                32619 => "WGS84 UTM zone 19N",
                32620 => "WGS84 UTM zone 20N",
                32621 => "WGS84 UTM zone 21N",
                32622 => "WGS84 UTM zone 22N",
                32623 => "WGS84 UTM zone 23N",
                32624 => "WGS84 UTM zone 24N",
                32625 => "WGS84 UTM zone 25N",
                32626 => "WGS84 UTM zone 26N",
                32627 => "WGS84 UTM zone 27N",
                32628 => "WGS84 UTM zone 28N",
                32629 => "WGS84 UTM zone 29N",
                32630 => "WGS84 UTM zone 30N",
                32631 => "WGS84 UTM zone 31N",
                32632 => "WGS84 UTM zone 32N",
                32633 => "WGS84 UTM zone 33N",
                32634 => "WGS84 UTM zone 34N",
                32635 => "WGS84 UTM zone 35N",
                32636 => "WGS84 UTM zone 36N",
                32637 => "WGS84 UTM zone 37N",
                32638 => "WGS84 UTM zone 38N",
                32639 => "WGS84 UTM zone 39N",
                32640 => "WGS84 UTM zone 40N",
                32641 => "WGS84 UTM zone 41N",
                32642 => "WGS84 UTM zone 42N",
                32643 => "WGS84 UTM zone 43N",
                32644 => "WGS84 UTM zone 44N",
                32645 => "WGS84 UTM zone 45N",
                32646 => "WGS84 UTM zone 46N",
                32647 => "WGS84 UTM zone 47N",
                32648 => "WGS84 UTM zone 48N",
                32649 => "WGS84 UTM zone 49N",
                32650 => "WGS84 UTM zone 50N",
                32651 => "WGS84 UTM zone 51N",
                32652 => "WGS84 UTM zone 52N",
                32653 => "WGS84 UTM zone 53N",
                32654 => "WGS84 UTM zone 54N",
                32655 => "WGS84 UTM zone 55N",
                32656 => "WGS84 UTM zone 56N",
                32657 => "WGS84 UTM zone 57N",
                32658 => "WGS84 UTM zone 58N",
                32659 => "WGS84 UTM zone 59N",
                32660 => "WGS84 UTM zone 60N",
                32701 => "WGS84 UTM zone 1S",
                32702 => "WGS84 UTM zone 2S",
                32703 => "WGS84 UTM zone 3S",
                32704 => "WGS84 UTM zone 4S",
                32705 => "WGS84 UTM zone 5S",
                32706 => "WGS84 UTM zone 6S",
                32707 => "WGS84 UTM zone 7S",
                32708 => "WGS84 UTM zone 8S",
                32709 => "WGS84 UTM zone 9S",
                32710 => "WGS84 UTM zone 10S",
                32711 => "WGS84 UTM zone 11S",
                32712 => "WGS84 UTM zone 12S",
                32713 => "WGS84 UTM zone 13S",
                32714 => "WGS84 UTM zone 14S",
                32715 => "WGS84 UTM zone 15S",
                32716 => "WGS84 UTM zone 16S",
                32717 => "WGS84 UTM zone 17S",
                32718 => "WGS84 UTM zone 18S",
                32719 => "WGS84 UTM zone 19S",
                32720 => "WGS84 UTM zone 20S",
                32721 => "WGS84 UTM zone 21S",
                32722 => "WGS84 UTM zone 22S",
                32723 => "WGS84 UTM zone 23S",
                32724 => "WGS84 UTM zone 24S",
                32725 => "WGS84 UTM zone 25S",
                32726 => "WGS84 UTM zone 26S",
                32727 => "WGS84 UTM zone 27S",
                32728 => "WGS84 UTM zone 28S",
                32729 => "WGS84 UTM zone 29S",
                32730 => "WGS84 UTM zone 30S",
                32731 => "WGS84 UTM zone 31S",
                32732 => "WGS84 UTM zone 32S",
                32733 => "WGS84 UTM zone 33S",
                32734 => "WGS84 UTM zone 34S",
                32735 => "WGS84 UTM zone 35S",
                32736 => "WGS84 UTM zone 36S",
                32737 => "WGS84 UTM zone 37S",
                32738 => "WGS84 UTM zone 38S",
                32739 => "WGS84 UTM zone 39S",
                32740 => "WGS84 UTM zone 40S",
                32741 => "WGS84 UTM zone 41S",
                32742 => "WGS84 UTM zone 42S",
                32743 => "WGS84 UTM zone 43S",
                32744 => "WGS84 UTM zone 44S",
                32745 => "WGS84 UTM zone 45S",
                32746 => "WGS84 UTM zone 46S",
                32747 => "WGS84 UTM zone 47S",
                32748 => "WGS84 UTM zone 48S",
                32749 => "WGS84 UTM zone 49S",
                32750 => "WGS84 UTM zone 50S",
                32751 => "WGS84 UTM zone 51S",
                32752 => "WGS84 UTM zone 52S",
                32753 => "WGS84 UTM zone 53S",
                32754 => "WGS84 UTM zone 54S",
                32755 => "WGS84 UTM zone 55S",
                32756 => "WGS84 UTM zone 56S",
                32757 => "WGS84 UTM zone 57S",
                32758 => "WGS84 UTM zone 58S",
                32759 => "WGS84 UTM zone 59S",
                32760 => "WGS84 UTM zone 60S",
                32767 => "User Defined",
                _ => "Unknown (" + value + ")"
            };
        }

        public string? GetProjectionDescription()
        {
            if (!Directory.TryGetUInt16(GeoTiffDirectory.TagProjection, out ushort value))
                return null;

            // Requirement 26.4
            // ProjectionGeoKey values in the range 1024-32766 SHALL be valid EPSG map projection (coordinate operation) codes
            // NOTE: In GeoTIFF v1.0 the range was 10000-19999. Several values in this range have been deprecated or deleted from the EPSG Dataset.

            return value switch
            {
                10101 => "Alabama CS27 East",
                10102 => "Alabama CS27 West",
                10131 => "Alabama CS83 East",
                10132 => "Alabama CS83 West",
                10201 => "Arizona Coordinate System east",
                10202 => "Arizona Coordinate System Central",
                10203 => "Arizona Coordinate System west",
                10231 => "Arizona CS83 east",
                10232 => "Arizona CS83 Central",
                10233 => "Arizona CS83 west",
                10301 => "Arkansas CS27 North",
                10302 => "Arkansas CS27 South",
                10331 => "Arkansas CS83 North",
                10332 => "Arkansas CS83 South",
                10401 => "California CS27 I",
                10402 => "California CS27 II",
                10403 => "California CS27 III",
                10404 => "California CS27 IV",
                10405 => "California CS27 V",
                10406 => "California CS27 VI",
                10407 => "California CS27 VII",
                10431 => "California CS83 1",
                10432 => "California CS83 2",
                10433 => "California CS83 3",
                10434 => "California CS83 4",
                10435 => "California CS83 5",
                10436 => "California CS83 6",
                10501 => "Colorado CS27 North",
                10502 => "Colorado CS27 Central",
                10503 => "Colorado CS27 South",
                10531 => "Colorado CS83 North",
                10532 => "Colorado CS83 Central",
                10533 => "Colorado CS83 South",
                10600 => "Connecticut CS27",
                10630 => "Connecticut CS83",
                10700 => "Delaware CS27",
                10730 => "Delaware CS83",
                10901 => "Florida CS27 East",
                10902 => "Florida CS27 West",
                10903 => "Florida CS27 North",
                10931 => "Florida CS83 East",
                10932 => "Florida CS83 West",
                10933 => "Florida CS83 North",
                11001 => "Georgia CS27 East",
                11002 => "Georgia CS27 West",
                11031 => "Georgia CS83 East",
                11032 => "Georgia CS83 West",
                11101 => "Idaho CS27 East",
                11102 => "Idaho CS27 Central",
                11103 => "Idaho CS27 West",
                11131 => "Idaho CS83 East",
                11132 => "Idaho CS83 Central",
                11133 => "Idaho CS83 West",
                11201 => "Illinois CS27 East",
                11202 => "Illinois CS27 West",
                11231 => "Illinois CS83 East",
                11232 => "Illinois CS83 West",
                11301 => "Indiana CS27 East",
                11302 => "Indiana CS27 West",
                11331 => "Indiana CS83 East",
                11332 => "Indiana CS83 West",
                11401 => "Iowa CS27 North",
                11402 => "Iowa CS27 South",
                11431 => "Iowa CS83 North",
                11432 => "Iowa CS83 South",
                11501 => "Kansas CS27 North",
                11502 => "Kansas CS27 South",
                11531 => "Kansas CS83 North",
                11532 => "Kansas CS83 South",
                11601 => "Kentucky CS27 North",
                11602 => "Kentucky CS27 South",
                11631 => "Kentucky CS83 North",
                11632 => "Kentucky CS83 South",
                11701 => "Louisiana CS27 North",
                11702 => "Louisiana CS27 South",
                11731 => "Louisiana CS83 North",
                11732 => "Louisiana CS83 South",
                11801 => "Maine CS27 East",
                11802 => "Maine CS27 West",
                11831 => "Maine CS83 East",
                11832 => "Maine CS83 West",
                11900 => "Maryland CS27",
                11930 => "Maryland CS83",
                12001 => "Massachusetts CS27 Mainland",
                12002 => "Massachusetts CS27 Island",
                12031 => "Massachusetts CS83 Mainland",
                12032 => "Massachusetts CS83 Island",
                12101 => "Michigan State Plane East",
                12102 => "Michigan State Plane Old Central",
                12103 => "Michigan State Plane West",
                12111 => "Michigan CS27 North",
                12112 => "Michigan CS27 Central",
                12113 => "Michigan CS27 South",
                12141 => "Michigan CS83 North",
                12142 => "Michigan CS83 Central",
                12143 => "Michigan CS83 South",
                12201 => "Minnesota CS27 North",
                12202 => "Minnesota CS27 Central",
                12203 => "Minnesota CS27 South",
                12231 => "Minnesota CS83 North",
                12232 => "Minnesota CS83 Central",
                12233 => "Minnesota CS83 South",
                12301 => "Mississippi CS27 East",
                12302 => "Mississippi CS27 West",
                12331 => "Mississippi CS83 East",
                12332 => "Mississippi CS83 West",
                12401 => "Missouri CS27 East",
                12402 => "Missouri CS27 Central",
                12403 => "Missouri CS27 West",
                12431 => "Missouri CS83 East",
                12432 => "Missouri CS83 Central",
                12433 => "Missouri CS83 West",
                12501 => "Montana CS27 North",
                12502 => "Montana CS27 Central",
                12503 => "Montana CS27 South",
                12530 => "Montana CS83",
                12601 => "Nebraska CS27 North",
                12602 => "Nebraska CS27 South",
                12630 => "Nebraska CS83",
                12701 => "Nevada CS27 East",
                12702 => "Nevada CS27 Central",
                12703 => "Nevada CS27 West",
                12731 => "Nevada CS83 East",
                12732 => "Nevada CS83 Central",
                12733 => "Nevada CS83 West",
                12800 => "New Hampshire CS27",
                12830 => "New Hampshire CS83",
                12900 => "New Jersey CS27",
                12930 => "New Jersey CS83",
                13001 => "New Mexico CS27 East",
                13002 => "New Mexico CS27 Central",
                13003 => "New Mexico CS27 West",
                13031 => "New Mexico CS83 East",
                13032 => "New Mexico CS83 Central",
                13033 => "New Mexico CS83 West",
                13101 => "New York CS27 East",
                13102 => "New York CS27 Central",
                13103 => "New York CS27 West",
                13104 => "New York CS27 Long Island",
                13131 => "New York CS83 East",
                13132 => "New York CS83 Central",
                13133 => "New York CS83 West",
                13134 => "New York CS83 Long Island",
                13200 => "North Carolina CS27",
                13230 => "North Carolina CS83",
                13301 => "North Dakota CS27 North",
                13302 => "North Dakota CS27 South",
                13331 => "North Dakota CS83 North",
                13332 => "North Dakota CS83 South",
                13401 => "Ohio CS27 North",
                13402 => "Ohio CS27 South",
                13431 => "Ohio CS83 North",
                13432 => "Ohio CS83 South",
                13501 => "Oklahoma CS27 North",
                13502 => "Oklahoma CS27 South",
                13531 => "Oklahoma CS83 North",
                13532 => "Oklahoma CS83 South",
                13601 => "Oregon CS27 North",
                13602 => "Oregon CS27 South",
                13631 => "Oregon CS83 North",
                13632 => "Oregon CS83 South",
                13701 => "Pennsylvania CS27 North",
                13702 => "Pennsylvania CS27 South",
                13731 => "Pennsylvania CS83 North",
                13732 => "Pennsylvania CS83 South",
                13800 => "Rhode Island CS27",
                13830 => "Rhode Island CS83",
                13901 => "South Carolina CS27 North",
                13902 => "South Carolina CS27 South",
                13930 => "South Carolina CS83",
                14001 => "South Dakota CS27 North",
                14002 => "South Dakota CS27 South",
                14031 => "South Dakota CS83 North",
                14032 => "South Dakota CS83 South",
                14100 => "Tennessee CS27",
                14130 => "Tennessee CS83",
                14201 => "Texas CS27 North",
                14202 => "Texas CS27 North Central",
                14203 => "Texas CS27 Central",
                14204 => "Texas CS27 South Central",
                14205 => "Texas CS27 South",
                14231 => "Texas CS83 North",
                14232 => "Texas CS83 North Central",
                14233 => "Texas CS83 Central",
                14234 => "Texas CS83 South Central",
                14235 => "Texas CS83 South",
                14301 => "Utah CS27 North",
                14302 => "Utah CS27 Central",
                14303 => "Utah CS27 South",
                14331 => "Utah CS83 North",
                14332 => "Utah CS83 Central",
                14333 => "Utah CS83 South",
                14400 => "Vermont CS27",
                14430 => "Vermont CS83",
                14501 => "Virginia CS27 North",
                14502 => "Virginia CS27 South",
                14531 => "Virginia CS83 North",
                14532 => "Virginia CS83 South",
                14601 => "Washington CS27 North",
                14602 => "Washington CS27 South",
                14631 => "Washington CS83 North",
                14632 => "Washington CS83 South",
                14701 => "West Virginia CS27 North",
                14702 => "West Virginia CS27 South",
                14731 => "West Virginia CS83 North",
                14732 => "West Virginia CS83 South",
                14801 => "Wisconsin CS27 North",
                14802 => "Wisconsin CS27 Central",
                14803 => "Wisconsin CS27 South",
                14831 => "Wisconsin CS83 North",
                14832 => "Wisconsin CS83 Central",
                14833 => "Wisconsin CS83 South",
                14901 => "Wyoming CS27 East",
                14902 => "Wyoming CS27 East Central",
                14903 => "Wyoming CS27 West Central",
                14904 => "Wyoming CS27 West",
                14931 => "Wyoming CS83 East",
                14932 => "Wyoming CS83 East Central",
                14933 => "Wyoming CS83 West Central",
                14934 => "Wyoming CS83 West",
                15001 => "Alaska CS27 1",
                15002 => "Alaska CS27 2",
                15003 => "Alaska CS27 3",
                15004 => "Alaska CS27 4",
                15005 => "Alaska CS27 5",
                15006 => "Alaska CS27 6",
                15007 => "Alaska CS27 7",
                15008 => "Alaska CS27 8",
                15009 => "Alaska CS27 9",
                15010 => "Alaska CS27 10",
                15031 => "Alaska CS83 1",
                15032 => "Alaska CS83 2",
                15033 => "Alaska CS83 3",
                15034 => "Alaska CS83 4",
                15035 => "Alaska CS83 5",
                15036 => "Alaska CS83 6",
                15037 => "Alaska CS83 7",
                15038 => "Alaska CS83 8",
                15039 => "Alaska CS83 9",
                15040 => "Alaska CS83 10",
                15101 => "Hawaii CS27 1",
                15102 => "Hawaii CS27 2",
                15103 => "Hawaii CS27 3",
                15104 => "Hawaii CS27 4",
                15105 => "Hawaii CS27 5",
                15131 => "Hawaii CS83 1",
                15132 => "Hawaii CS83 2",
                15133 => "Hawaii CS83 3",
                15134 => "Hawaii CS83 4",
                15135 => "Hawaii CS83 5",
                15201 => "Puerto Rico CS27",
                15202 => "St Croix",
                15230 => "Puerto Rico Virgin Is",
                15302 => "Kentucky CS27",
                15303 => "Kentucky CS83 North",
                15914 => "BLM 14N feet",
                15915 => "BLM 15N feet",
                15916 => "BLM 16N feet",
                15917 => "BLM 17N feet",
                16001 => "UTM zone 1N",
                16002 => "UTM zone 2N",
                16003 => "UTM zone 3N",
                16004 => "UTM zone 4N",
                16005 => "UTM zone 5N",
                16006 => "UTM zone 6N",
                16007 => "UTM zone 7N",
                16008 => "UTM zone 8N",
                16009 => "UTM zone 9N",
                16010 => "UTM zone 10N",
                16011 => "UTM zone 11N",
                16012 => "UTM zone 12N",
                16013 => "UTM zone 13N",
                16014 => "UTM zone 14N",
                16015 => "UTM zone 15N",
                16016 => "UTM zone 16N",
                16017 => "UTM zone 17N",
                16018 => "UTM zone 18N",
                16019 => "UTM zone 19N",
                16020 => "UTM zone 20N",
                16021 => "UTM zone 21N",
                16022 => "UTM zone 22N",
                16023 => "UTM zone 23N",
                16024 => "UTM zone 24N",
                16025 => "UTM zone 25N",
                16026 => "UTM zone 26N",
                16027 => "UTM zone 27N",
                16028 => "UTM zone 28N",
                16029 => "UTM zone 29N",
                16030 => "UTM zone 30N",
                16031 => "UTM zone 31N",
                16032 => "UTM zone 32N",
                16033 => "UTM zone 33N",
                16034 => "UTM zone 34N",
                16035 => "UTM zone 35N",
                16036 => "UTM zone 36N",
                16037 => "UTM zone 37N",
                16038 => "UTM zone 38N",
                16039 => "UTM zone 39N",
                16040 => "UTM zone 40N",
                16041 => "UTM zone 41N",
                16042 => "UTM zone 42N",
                16043 => "UTM zone 43N",
                16044 => "UTM zone 44N",
                16045 => "UTM zone 45N",
                16046 => "UTM zone 46N",
                16047 => "UTM zone 47N",
                16048 => "UTM zone 48N",
                16049 => "UTM zone 49N",
                16050 => "UTM zone 50N",
                16051 => "UTM zone 51N",
                16052 => "UTM zone 52N",
                16053 => "UTM zone 53N",
                16054 => "UTM zone 54N",
                16055 => "UTM zone 55N",
                16056 => "UTM zone 56N",
                16057 => "UTM zone 57N",
                16058 => "UTM zone 58N",
                16059 => "UTM zone 59N",
                16060 => "UTM zone 60N",
                16101 => "UTM zone 1S",
                16102 => "UTM zone 2S",
                16103 => "UTM zone 3S",
                16104 => "UTM zone 4S",
                16105 => "UTM zone 5S",
                16106 => "UTM zone 6S",
                16107 => "UTM zone 7S",
                16108 => "UTM zone 8S",
                16109 => "UTM zone 9S",
                16110 => "UTM zone 10S",
                16111 => "UTM zone 11S",
                16112 => "UTM zone 12S",
                16113 => "UTM zone 13S",
                16114 => "UTM zone 14S",
                16115 => "UTM zone 15S",
                16116 => "UTM zone 16S",
                16117 => "UTM zone 17S",
                16118 => "UTM zone 18S",
                16119 => "UTM zone 19S",
                16120 => "UTM zone 20S",
                16121 => "UTM zone 21S",
                16122 => "UTM zone 22S",
                16123 => "UTM zone 23S",
                16124 => "UTM zone 24S",
                16125 => "UTM zone 25S",
                16126 => "UTM zone 26S",
                16127 => "UTM zone 27S",
                16128 => "UTM zone 28S",
                16129 => "UTM zone 29S",
                16130 => "UTM zone 30S",
                16131 => "UTM zone 31S",
                16132 => "UTM zone 32S",
                16133 => "UTM zone 33S",
                16134 => "UTM zone 34S",
                16135 => "UTM zone 35S",
                16136 => "UTM zone 36S",
                16137 => "UTM zone 37S",
                16138 => "UTM zone 38S",
                16139 => "UTM zone 39S",
                16140 => "UTM zone 40S",
                16141 => "UTM zone 41S",
                16142 => "UTM zone 42S",
                16143 => "UTM zone 43S",
                16144 => "UTM zone 44S",
                16145 => "UTM zone 45S",
                16146 => "UTM zone 46S",
                16147 => "UTM zone 47S",
                16148 => "UTM zone 48S",
                16149 => "UTM zone 49S",
                16150 => "UTM zone 50S",
                16151 => "UTM zone 51S",
                16152 => "UTM zone 52S",
                16153 => "UTM zone 53S",
                16154 => "UTM zone 54S",
                16155 => "UTM zone 55S",
                16156 => "UTM zone 56S",
                16157 => "UTM zone 57S",
                16158 => "UTM zone 58S",
                16159 => "UTM zone 59S",
                16160 => "UTM zone 60S",
                16200 => "Gauss Kruger zone 0",
                16201 => "Gauss Kruger zone 1",
                16202 => "Gauss Kruger zone 2",
                16203 => "Gauss Kruger zone 3",
                16204 => "Gauss Kruger zone 4",
                16205 => "Gauss Kruger zone 5",
                17348 => "Map Grid of Australia 48",
                17349 => "Map Grid of Australia 49",
                17350 => "Map Grid of Australia 50",
                17351 => "Map Grid of Australia 51",
                17352 => "Map Grid of Australia 52",
                17353 => "Map Grid of Australia 53",
                17354 => "Map Grid of Australia 54",
                17355 => "Map Grid of Australia 55",
                17356 => "Map Grid of Australia 56",
                17357 => "Map Grid of Australia 57",
                17358 => "Map Grid of Australia 58",
                17448 => "Australian Map Grid 48",
                17449 => "Australian Map Grid 49",
                17450 => "Australian Map Grid 50",
                17451 => "Australian Map Grid 51",
                17452 => "Australian Map Grid 52",
                17453 => "Australian Map Grid 53",
                17454 => "Australian Map Grid 54",
                17455 => "Australian Map Grid 55",
                17456 => "Australian Map Grid 56",
                17457 => "Australian Map Grid 57",
                17458 => "Australian Map Grid 58",
                18031 => "Argentina 1",
                18032 => "Argentina 2",
                18033 => "Argentina 3",
                18034 => "Argentina 4",
                18035 => "Argentina 5",
                18036 => "Argentina 6",
                18037 => "Argentina 7",
                18051 => "Colombia 3W",
                18052 => "Colombia Bogota",
                18053 => "Colombia 3E",
                18054 => "Colombia 6E",
                18072 => "Egypt Red Belt",
                18073 => "Egypt Purple Belt",
                18074 => "Extended Purple Belt",
                18141 => "New Zealand North Island Nat Grid",
                18142 => "New Zealand South Island Nat Grid",
                19900 => "Bahrain Grid",
                19905 => "Netherlands E Indies Equatorial",
                19912 => "RSO Borneo",
                19926 => "Stereo 70",
                32767 => "User Defined",
                _ => "Unknown (" + value + ")"
            };
        }

        public string? GetProjectedCoordinateTransformDescription()
        {
            if (!Directory.TryGetUInt16(GeoTiffDirectory.TagProjectedCoordinateTransform, out ushort value))
                return null;

            // Requirements Class 27.0: ProjMethodGeoKey
            // 27.3: ProjMethodGeoKey values in the range 1-27 SHALL be GeoTIFF map projection method codes (NOTE: See Annex C)
            // 27.4: ProjMethodGeoKey values in the range 28-32766 SHALL be reserved

            return value switch
            {
                1 => "Transverse Mercator",
                2 => "Transverse Mercator Modified Alaska",
                3 => "Oblique Mercator",
                4 => "Oblique Mercator Laborde",
                5 => "Oblique Mercator Rosenmund",
                6 => "Oblique Mercator Spherical",
                7 => "Mercator",
                8 => "Lambert Conf Conic 2SP",
                9 => "Lambert Conf Conic 1SP",
                10 => "Lambert Azim Equal Area",
                11 => "Albers Equal Area",
                12 => "Azimuthal Equidistant",
                13 => "Equidistant Conic",
                14 => "Stereographic",
                15 => "Polar Stereographic",
                16 => "Oblique Stereographic",
                17 => "Equirectangular",
                18 => "Cassini Soldner",
                19 => "Gnomonic",
                20 => "Miller Cylindrical",
                21 => "Orthographic",
                22 => "Polyconic",
                23 => "Robinson",
                24 => "Sinusoidal",
                25 => "VanDerGrinten",
                26 => "New Zealand Map Grid",
                27 => "Transverse Mercator South Orientated",
                28 => "Cylindrical Equal Area",
                9801 => "Lambert Conic Conformal 1SP",
                9802 => "Lambert Conic Conformal 2SP",
                9803 => "Lambert Conic Conformal 2SP Belgium",
                9804 => "Mercator variant A",
                9805 => "Mercator variant B",
                9806 => "Cassini-Soldner",
                9807 => "Transverse Mercator",
                9808 => "Transverse Mercator South Orientated",
                9809 => "Oblique Stereographic",
                9810 => "Polar Stereographic variant A",
                9811 => "New Zealand Map Grid",
                9812 => "Hotine Oblique Mercator variant A",
                9813 => "Laborde Oblique Mercator",
                9814 => "Swiss Oblique Cylindrical",
                9815 => "Hotine Oblique Mercator variant B",
                9816 => "Tunisia Mining Grid",
                9817 => "Lambert Conic Near-Conformal",
                9818 => "American Polyconic",
                9819 => "Krovak",
                9820 => "Lambert Azimuthal Equal Area",
                9821 => "Lambert Azimuthal Equal Area Spherical",
                9822 => "Albers Equal Area",
                9823 => "Equidistant Cylindrical Spherical",
                9824 => "Transverse Mercator Zoned Grid System",
                9825 => "Pseudo Plate Carree",
                9826 => "Lambert Conic Conformal West Orientated",
                9827 => "Bonne",
                9828 => "Bonne South Orientated",
                9829 => "Polar Stereographic variant B",
                9830 => "Polar Stereographic variant C",
                9831 => "Guam",
                9832 => "Modified Azimuthal Equidistant",
                9833 => "Hyperbolic Cassini-Soldner",
                9834 => "Lambert Cylindrical Equal Area Spherical",
                9835 => "Lambert Cylindrical Equal Area",
                9836 => "Geocentric/Topocentric Conversions",
                9837 => "Geographic/Topocentric Conversions",
                9838 => "Vertical Perspective",
                9839 => "Vertical Perspective Orthographic Case",
                9840 => "Orthographic",
                9841 => "Mercator 1SP Spherical",
                9842 => "Equidistant Cylindrical",
                9843 => "Axis Order Reversal 2D",
                9844 => "Axis Order Reversal Geographic3D Horizontal",
                32767 => "User Defined",
                _ => "Unknown (" + value + ")"
            };
        }

        public string? GetChartFormatDescription()
        {
            if (!Directory.TryGetUInt16(GeoTiffDirectory.TagChartFormat, out ushort value))
                return null;

            return value switch
            {
                47500 => "General",
                47501 => "Coastal",
                47502 => "Harbor",
                47503 => "SailingInternational",
                47504 => "SmallCraft Route",
                47505 => "SmallCraftArea",
                47506 => "SmallCraftFolio",
                47507 => "Topographic",
                47508 => "Recreation",
                47509 => "Index",
                47510 => "Inset",
                _ => "Unknown (" + value + ")"
            };
        }

        public string? GetChartSoundingDatumDescription()
        {
            if (!Directory.TryGetUInt16(GeoTiffDirectory.TagChartSoundingDatum, out ushort value))
                return null;

            return value switch
            {
                47600 => "Equatorial Spring Low Water",
                47601 => "Indian Spring Low Water",
                47602 => "Lowest Astronomical Tide",
                47603 => "Lowest Low Water",
                47604 => "Lowest Normal Low Water",
                47605 => "Mean Higher High Water",
                47606 => "Mean High Water",
                47607 => "Mean High Water Springs",
                47608 => "Mean Lower Low Water",
                47609 => "Mean Lower Low Water Springs",
                47610 => "Mean Low Water",
                47611 => "Mean Sea Level",
                47612 => "Tropic Higher High Water",
                47613 => "Tropic Lower Low Water",
                _ => "Unknown (" + value + ")"
            };
        }
    }
}
